1、2010-1-10,1,Java面向对象程序设计 第8章,配合例子源代码一起使用,Power point 制作:耿祥义 张跃平,几个重要的设计模式,2010-1-10,2,主要内容 设计模式简介 策略模式 中介者模式 模板方法模式 难点 策略模式,导读,一个好的设计系统往往是易维护、易扩展、易复用的 。设计模式从一些优秀的设计系统中总结出的设计精髓,因此学习设计模式对提高设计能力无疑是非常有帮助的。可以是通过讲解设计模式体现面向对象的设计思想,这非常有利于更好地使用面向对象语言解决设计中的诸多问题。,2010-1-10,3,8.1 设计模式简介 8.1.1 什么是设计模式,一个设计模式(pat
2、tern)是针对某一类问题的最佳解决方案,而且已经被成功应用于许多系统的设计中,它解决了在某种特定情景中重复发生的某个问题,即一个设计模式是从许多优秀的软件系统中总结出的成功的可复用的设计方案。,2010-1-10,4,8.1.2 学习设计模式的必要性,学习并使用模式能使设计的系统易维护、可扩展性强、复用性好。 学习设计模式不仅可以使我们了解、正确使用设计模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的诸多问题。,2010-1-10,5,8.1.3 什么是框架,框架是针对某个领域,提供用于开发应用系统的类的集合,程序设计者可以使用框架
3、提供的类设计一个应用程序,而且在设计应用程序时可以针对特定的问题使用某个设计模式。框架与模式相比:1层次不同 2范围不同 3相互关系密切,2010-1-10,6,8.2 策略模式 8.2.1 概述,基于“面向抽象编程”的原则就容易使设计的类应对用户需求的变化,使得设计的系统满足“开-闭”原则。,2010-1-10,7,8.2.2 策略模式的定义,策略模式的定义:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。,2010-1-10,8,8.2.3 模式的结构,在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。 角色:策略(
4、Strategy),具体策略(ConcreteStrategy),上下文(Context)。 策略模式的UML类图,3.结构的描述 :策略(Strategy) Computable.java具体策略(ConcreteStrategy) StrategyOne.java , StrategyTwo.java, StrategyThree.java上下文(Context) GymnasticsGame.java,2010-1-10,9,8.2.4 模式的使用,应用程序Application.java中使用了策略模式中(8.2.3)所涉及的类,应用程序在使用策略模式时,需要创建具体策略的实例,并传递
5、给上下文对象。,2010-1-10,10,8.2.5 策略模式的优点,上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。,2010-1-10,11,8.2.6 适合使用策略模式的情景,一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式避免在类中使用大量的条件语句。程序不希望暴露复杂的、与算法相关的数据结构,那么可以
6、使用策略模式封装算法。需要使用一个算法的不同变体。,2010-1-10,12,8.2.7 策略模式相对继承机制的优势,策略模式采用的是组合方法,即将一个类的某个方法的内容的不同变体分别封装在不同的类中,而该类仅仅依赖这些类所实现的一个共同接口。,2010-1-10,13,8.3 中介者模式 8.3.1 概述,中介者模式体现了 “多用组合,少用继承”和“低藕合”原则,尤其体现了怎样合理地使用组合。,2010-1-10,14,8.3.2 中介者模式的定义,中介者模式的定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
7、,2010-1-10,15,8.3.3 模式的结构,角色:中介者(Mediator),具体中介者(ConcreteMediator ),同事(Colleague),具体同事(ConcreteColleague)。 中介者模式的UML类图,3.结构的描述 :同事(Colleague) Colleague.java 具体中介者(Mediator)ConcreteMediator.java具体同事(ConcreteColleague)ColleagueA.java , ColleagueB.java , ColleagueC.java,2010-1-10,16,8.3.4 模式的使用,应用程序App
8、lication.java中使用了中介者模式结构中(8.3.3)所涉及的类。,2010-1-10,17,8.3.5 中介者模式的优点,可以避免许多的对象为了之间的通信而相互显示引用,否则不仅系统难于维护,而且也使其他系统难以复用这些对象。可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。,2010-1-10,18,8.3.6 适合使用中介者模式的情景,系统中许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护,这时应考虑使用中介者模式。,2010-1-10,1
9、9,8.4 模板方法模式 8.4.1 概述,模板方法模式体现了怎样合理地组织算法。例如: 类客运车站在安排乘客上车时都进行:安全检查、验证车票,选择车体类型三个步骤。因此我们可以在一个抽象类中包含有:“安全检查”、“验证车票”,“选择车体”的抽象方法,而且该抽象类特别地包含有一个称作“模板”的方法,该方法顺序地调用“安全检查”、“验证车票”,“选择车体”这三个方法方法。,2010-1-10,20,8.4.2 模板方法模式的定义,模板方法模式的定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。,2010-1-10,
10、21,8.4.3 模式的结构,角色:抽象模板(Abstract Template),具体模板(Concrete Template)。 模板方法模式的UML类图,3.结构的描述 :抽象模板(Abstract Template) Station.java 具体模板(Concrete Template) RailwayStation.java , AutoStation.java,2010-1-10,22,8.4.4 模式的使用,应用程序Application.java中使用了模板方法模式结构中(8.4.3)所涉及的类。,2010-1-10,23,8.4.5 模板方法模式的优点,可以通过在抽象模板定义模板方法给出成熟的算法步骤,同时又不限制步骤的细节,具体模板实现算法细节不会改变整个算法的骨架。,2010-1-10,24,8.4.6 适合使用模板方法模式的情景,设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现。 需要对代码进行重构,将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复。,