《设计模式-工大》PPT课件.ppt
《《设计模式-工大》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《设计模式-工大》PPT课件.ppt(184页珍藏版)》请在三一办公上搜索。
1、哈尔滨工业大学计算机学院唐好选,软件设计模式,主要内容,软件设计模式基础创建型模式结构型模式行为型模式,广义讲,软件设计模式是可解决一类软件问题并能重复使用的软件设计方案狭义讲,设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。是在类和对象的层次描述的可重复使用的软件设计问题的解决方案模式体现的是程序整体的构思,所以有时候它也会出现在分析或者是概要设计阶段 模式的核心思想是通过增加抽象层,把变化部分从那些不变部分里分离出来,什么是设计模式,模式名称(Pattern Name)问题(Problem):描述应该在何时使用模式。解释了设计问题和问题存在的前因后果,可能还描述模
2、式必须满足的先决条件解决方案(Solution):描述了设计的组成成分、相互关系及各自的职责和协作方式。模式就像一个模板,可应用于多种场合,所以解决方案并不描述一个具体的设计或实现,而是提供设计问题的抽象描述和解决问题所采用的元素组合(类和对象)效果(consequences):描述模式的应用效果及使用模式应权衡的问题,模式的基本要素,模式名和分类意图:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?动机:说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景适用性:什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?如何识别这些情况?结构:采用
3、对象建模技术对模式中的类进行图形描述,如何描述设计模式,参与者:指设计模式中的类 和/或 对象以及它们各自的职责协作:模式的参与者如何协作以实现其职责效果:模式如何支持其目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可以独立改变?实现:实现模式时需了解的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于实现语言的问题代码示例:用来说明怎样实现该模式的代码片段相关模式:与这个模式紧密相关的模式有哪些?其不同之处是什么?这个模式应与哪些其他模式一起使用?,描述设计模式(续),开-闭原则(Open Closed Principal)单一职责原则里氏代换原则依赖倒置原则接口隔离原则,
4、设计模式的原则,设计模式就是实现了上述原则,从而达到代码复用、增加可维护性的目的,定义:软件对扩展是开放的,对修改是关闭的。开发一个软件时,应可以对其进行功能扩展(开放),在进行扩展的时候,不需要对原来的程序进行修改(关闭)好处:在软件可用性上非常灵活。可以在软件完成后对软件进行扩展,加入新的功能。这样,软件就可通过不断的增加新模块满足不断变化的新需求由于不修改软件原来的模块,不用担心软件的稳定性,开闭原则(OCP),实现的主要原则抽象原则:把系统的所有可能的行为抽象成一个底层;由于可从抽象层导出一个或多个具体类来改变系统行为,因此对于可变部分,系统设计对扩展是开放的可变性封装原则:对系统所有
5、可能发生变化的部分进行评估和分类,每一个可变的因素都单独进行封装,开闭原则(OCP),就一个类而言,应该仅有一个引起它变化的原因每一个引起类变化的原因就是一个职责,当类具有多职责时,应把多余职责分离出去,分别创建一些类来完成每一个职责每一个职责都是一个变化的轴线,当需求变化时会反映为类的职责的变化举例 interface Modem public void dial(String pno);public void hangup();public send(char c);public char recv();Modem类有两个职责:连接管理和数据通信,应将它们分离,单一职责原则(SRP),li
6、stKov替换原则(LSP),定义:“继承必须确保超类所拥有的性质在子类中仍然成立”,当一个子类的实例能够替换任何其超类的实例时,它们之间才具有is-A关系里氏替换原则是继承复用的基石,只有当派生类可以替换掉其基类,而软件功能不受影响时,基类才能真正被复用,派生类也才能够在基类的基础上增加新的行为LSP本质:在同一个继承体系中的对象应该有共同的行为特征例子:企鹅是鸟吗?生物学:企鹅属于鸟类 LSP原则:企鹅不属于鸟类,因为企鹅不会“飞”违反LSP的后果:有可能需要修改客户代码,依赖倒置原则(DIP),定义:高层模块不应依赖低层模块,二者都应该依赖于抽象高层模块只应该包含重要的业务模型和策略选择
7、,低层模块则是不同业务和策略的实现高层抽象不依赖高层和低层模块的具体实现,最多只依赖于低层的抽象低层抽象和实现也只依赖于高层抽象 辅助原则 任何变量都不应该持有一个指向具体类的引用任何类都不应该从具体类派生任何方法都不应覆盖其任何基类中已经实现了的方法,接口隔离原则(ISP),多个和客户相关的接口要好于一个通用接口如果一个类有几个使用者,与其让这个类载入所有使用者需要使用的所有方法,还不如为每个使用者创建一个特定接口,并让该类分别实现这些接口,在设计模式经典著作GOF95中,设计模式从应用的角度被分为三个大的类型 创建型模式/结构型模式/行为型模式根据模式的范围分,模式用于类还是用于对象类模式
8、:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了对象模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性从某种意义上来说,几乎所有模式都使用继承机制,所以“类模式”只指那些集中于处理类间关系的模式,而大部分模式都属于对象模式的范畴,设计模式的类型,用来创建对象的模式,抽象了实例化过程 工厂模式:父类负责定义创建对象的公共接口,而子类则负责生成具体对象,将类的实例化操作延迟到子类中完成抽象工厂模式:为一个产品族提供统一的创建接口。当需要这个产品族的某一系列的时候,可以从抽象工厂中选出相应的系列创建一个具体的工厂类单件(Singleton)模式:保证一
9、个类有且仅有一个实例,提供一个全局访问点,创建型设计模式,创建型设计模式,生成器(Builder)模式:将复杂对象创建与表示分离,同样的创建过程可创建不同的表示。允许用户通过指定复杂对象类型和内容来创建对象,用户不需要知道对象内部的具体构建细节原型(Prototype)模式:通过“复制”一个已经存在的实例来返回新的实例(不新建实例)。被复制的实例就是“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据,结构型模式讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式)
10、,或者通过组合一些对象来实现新的功能(对象结构型模式)组合(Composite)模式:定义一个接口,使之用于单一对象,也可以应用于多个单一对象组成的对象组装饰(Decorator)模式:给对象动态添加额外的职责,就好像给一个物体加上装饰物,完善其功能代理(Proxy)模式:在软件系统中,有些对象有时候由于跨越网络或者其他障碍,而不能够或者不想直接访问另一个对象,直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切,这就是代理(Proxy)模式,结构型设计模式,结构型设计模式,享元(Flyweight)模式:Flyweight是一
11、个共享对象,它可以同时在不同上下文(Context)使用外观(Facade)模式:外观模式为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度,使子系统更易于使用和管理。外观承担了子系统中类交互的责任桥梁(Bridge)模式:桥梁模式的用意是将问题的抽象和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题适配器(Adapter)模式:将一个类的接口适配成用户所期待的接口。一个适配器允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包装在一个已存在的类中,着力解决的是类实体之间的通讯关系,希望以面向对象的方式描述一个控制流程模版(Template)模
12、式:定义了一个算法步骤,并允许子类为一个或多个步骤提供实现。子类在不改变算法架构的情况下,可重新定义算法中某些步骤观察者(Observer)模式:定义了对象之间一对多的依赖,当这个对象的状态发生改变的时候,多个对象会接受到通知,有机会做出反馈迭代子(Iterator)模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示,行为型设计模式,责任链(Chain of Responsibility)模式:很多对象由每一个对象对其下一个对象的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个
13、请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态命令(Command)模式:将请求及其参数封装成一个对象,作为命令发起者和接收者的中介,可以对这些请求排队或记录请求日志,以及支持可撤销操作,行为型设计模式,状态(State)模式:允许一个“对象”在其内部状态改变的时候改变其行为,即不同的状态,不同的行为访问者(Visitor)模式:表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作 解
14、释器(Interpreter)模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子中介者(Mediator)模式:用一个中介对象来封装一系列的对象交互策略(Strategy)模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化,行为型设计模式,创建型设计模式,工厂模式抽象工厂模式建造者模式单件模式原型模式,创建型设计模式,在面向对象编程中,常用的方法是用new操作符构造对象实例,但在有些情况下,new操作符直接生成对象会带来一些问题(1)创建对象之前必须清楚所要创建对象的类信
15、息,但个别情况下无法达到此要求,譬如打开一个视频文件需要一个播放器对象,但是用户可能不知道具体播放器叫什么名字,需要系统分派给这个视频文件一个合适的播放器,这种情况下用new运算符并不合适,工厂模式的由来,(2)许多类型对象的创造需要一系列步骤需要计算或取得对象的初始设置需要选择生成哪个子对象实例在生成需要对象之前必须先生成一些辅助功能对象在这些情况,新对象的建立就是一个“过程”,而不仅仅是一个操作。为了能方便地完成这些复杂的对象创建工作,可引入工厂模式,工厂模式的由来,工厂模式的结构,Product:定义工厂方法所创建对象的接口ConcreteProduct:实现Product接口Facto
16、ry:声明工厂方法,返回一个Product类型对象。Factory也可以定义一个工厂方法的缺省实现,返回一个缺省ConcreteProduct对象Concrete Factory:重定义工厂方法,返回一个ConcreteProduct实例,工厂模式的参与者,一个日志管理器:设计日志记录类,支持记录的方法有FileLogEventLog,工厂模式实例分析,/LogFactory类publicabstractclassLogFactory publicabstractLogCreate();,工厂模式实例分析,/FileFactory类publicclassFileFactory:LogFacto
17、rypublicoverrideFileLogCreate()returnnewFileLog();,/EventFactory类publicclassEventFactory:LogFactorypublicoverrideEventLogCreate()returnnewEventLog();,publicclassApppublicstaticvoidMain(stringargs)LogFactoryfactory=newEventFactory();/FileFactoryfactory=newFileFactory();Loglog=factory.Create();log.Wri
18、te();,工厂模式客户端程序,客户程序有效避免了具体产品对象和应用程序之间的耦合,增加了具体工厂对象和应用程序之间的耦合在类内部创建对象通常比直接创建对象更灵活工厂模式通过面向对象的手法,将具体对象的创建工作延迟到子类,提供了一种扩展策略,较好的解决了紧耦合问题,工厂模式实例分析,抽象工厂模式的由来,在软件系统中,经常面临“一系列相互依赖对象”的创建工作,由于需求变化,这“一系列相互依赖的对象”也要改变,如何应对这种变化呢?如何像工厂模式一样绕过常规的”new”,提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?一种说法:可以将这些对象一个个通过工厂模式来创建。但是
19、,既然是一系列相互依赖的对象,它们是有联系的,每个对象都这样解决,如何保证他们的联系呢?,实例:Windows桌面主题,当更换一个桌面主题的时候,系统的开始按钮、任务栏、菜单栏、工具栏等都变了,而且是一起变的,他们的色调都很一致,类似这样的问题如何解决呢?应用抽象工厂模式,是一种有效的解决途径,抽象工厂模式的由来,抽象工厂模式的意图,意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类适用场合一个系统独立于其产品创建、组合和表示时一个系统由多个产品系列中的一个来配置时强调一系列相关产品对象的设计以便进行联合时提供一个产品类库,只想显示其接口而非实现时,抽象工厂模式的结构,A
20、bstract Factory:声明创建抽象产品对象的操作接口ConcreteFactory:实现创建具体对象的操作Abstract Product:为一类产品对象声明一个接口ConcreteProduct:定义一个被具体工厂创建的产品对象,抽象工厂模式的参与者,实例:需要设计一个花园布局 花园有三种风格:典雅型、实用型和懒人型 花园中有3个位置需要种植植物:花台、墙角和花园中心,抽象工厂模式的应用实例,建造者(Builder)模式的由来,在软件系统中,有时面临着“一个复杂对象”的创建工作,该复杂对象通常由各个部分的子对象用一定的算法构成这个复杂对象的各个部分经常面临着剧烈变化,但是将它们组合
21、在一起的算法却相对稳定如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?,建造者模式的意图和适用性,意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示适用性场合需要生成的产品对象有复杂的内部结构创建复杂对象的算法稳定,或建造者模式可以强迫生成一定的顺序当构造过程允许被构造的对象有不同的表示时,建造者模式的结构,建造者模式的参与者,Builder:为创建一个Product对象的各个部件指定抽象接口ConcreteBuilder:实现Builder接口来构造和装配产品各个部件,提供一个检索产
22、品的接口Director:构造一个使用Builder接口的对象Product:表示被构造的复杂对象,实例:设计游戏场景中的房屋房屋由五个部分组成:地板、墙壁、窗户、门和天花板构建房屋的步骤固定,而具体组件(门、窗等)易变采用建造者模式分离易变组件和稳定的构建过程,建造者模式的应用示例,public abstract class House/定义一个房屋抽象类 public abstract class Builder/这一部分是易变的 public abstract void BuildFloor();/地板 public abstract void BuildDoor();/门 public
23、 abstract void BuildWindows();/窗户 public abstract void BuildWall();/墙壁 public abstract void BuildHouseCeiling()/天花板 public abstract House GetHouse();,建造者模式的应用示例,建造者模式的应用示例,public abstract class GameManager public static House CreateHouse(Builder builder)builder.BuildFloor();builder.BuildDoor();build
24、er.Buildwall();builder.BuildWindows();builder.BuildHouseCeiling();return builder.GetHouse();,建造者模式的应用示例,public class RomanHouseBuilder:Builder public override void BuildDoor()public override void BuildFloor()public override void BuildWindows()public override void BuildWall()public override void Buil
25、dHouseCeiling()public override House GetHouse(),建造者模式的应用示例,class App public static void main()House house=GameManager.CreateHouse(new RomanHouseBuilder();,建造者模式分析,建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节每一个Builder都相对独立,而与其它Builder无关可对构造过程更加精细控制将构建代码和表示代码分开建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动,单件(S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计模式-工大 设计 模式 PPT 课件
链接地址:https://www.31ppt.com/p-5605447.html