设计模式浅谈(24种)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机学院计算机科学教研室16650709@qq.com设计模式DesignPatterns准备——理解面向对象设计的原则开放-封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。里氏代换原则:子类型必须能够替换掉它们的父类型。依赖倒转原则:A.高层模块不应该依赖低层模块。两个都应该依赖抽象。B.抽象不应该依赖细节。细节应该依赖抽象。请参考《面向对象设计的原则》2概述导致重新设计的一般原因通过显式指定一个类来创建对象对特殊操作的依赖对硬件和软件平台的依赖对对象表示和实现的依赖对算法的依赖紧耦合通过生成子类来扩充功能不能方便地对类进行修改3概述4原则一:对接口编程,而不是对实现编程原则二:优先使用对象组合,而不是继承概述什么是设计模式设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。设计模式的内容模式名称Patternname问题Problem解决方案Solution效果Consequences5概述设计模式编目范围目的创建型结构型行为型类FactoryMethodAdapterInterpreterTemplateMethod对象AbstractFactoryBuilderPrototypeSingletonAdapterBridgeCompositeDecoratorFacadeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor设计模式之间的关系7创建型模式创建型模式的目的使系统独立于如何创建、组合和表示对象。类创建型模式使用继承改变被实例化的类。对象创建型模式将实例化委托给另一个对象。8AbstractFactoryBuilderFactoryMethodPrototypeSingleton创建型模式三种Factory模式:SimpleFactory(简单工厂)模式:专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。FactoryMethod(工厂方法)模式:将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。AbstractFactory(抽象工厂)模式:提供一个共同的接口来创建相互关联的多个对象。9创建型模式FactoryMethod(工厂方法)类创建型模式意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。适用性当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。10创建型模式FactoryMethod(工厂方法)11创建型模式FactoryMethod(工厂方法)效果用工厂方法在类中创建对象比直接创建更灵活,子类可以提供对象的扩展版本。连接平行的类层次,将哪些类应一同工作的信息局部化。实现Creator可以只声明工厂方法,也可以提供缺省的实现。可以使用模板以避免创建子类。可采用适当的命名约定说明正在使用工厂方法。12创建型模式AbstractFactory(抽象工厂)对象创建型模式意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用性一个系统要独立于它的产品的创建、组合和表示时。一个系统要用多个产品系列中的一个来配置时。要强调一系列相关的产品对象的设计以便进行联合使用时。提供一个产品类库,而只想显示它们的接口而不是实现时。13创建型模式AbstractFactory(抽象工厂)14创建型模式15创建型模式AbstractFactory(抽象工厂)效果由工厂封装产品对象的创建,将客户与类的实现分离。易于交换产品系列。有利于产品的一致性。难以支持新种类的产品。实现通常可以将工厂作为Singleton。AbstractFactory声明创建产品的接口,由工厂子类负责创建产品,通常为每个产品定义一个工厂方法。一种更灵活但不太安全的设计是以参数方式创建对象。16创建型模式Builder(生成器)对象创建型模式意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。适用性当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。当构造过程必须允许被构造的对象有不同的表示时。17创建型模式Builder(生成器)18创建型模式四个角色:建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。具体建造者(ConcreteBuilder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。19创建型模式指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。产品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。20创建型模式Builder(生成器)21classBuilder{//创建部件A比如创建汽车车轮voidbuildPartA();//创建部件B比如创建汽车方向盘voidbuildPartB();//创建部件C比如创建汽车发动机voidbuildPartC();//返回最后组装成品结果(返回最后装配好的汽车)//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.//从而实现了解耦过程和部件Product*getResult();};classDirector{privateBuilder*m_builder;publicDirector(Builder*builder){m_builder=builder;}//将部件partApartBpartC最后组成复杂对象//这里是将车轮方向盘和发动机组装成汽车的过程publicvoidconstruct(){builder-buildPartA();builder-buildPartB();builder-buildPartC();}};classConcreteBuilder:publicBuilder{PartpartA,partB,partC;public:voidbuildPartA(){//这里是具体如何构建partA的代码}voidbuildPartB(){//这里是具体如何构建partB的代码}voidbuildPartC(){//这里是具体如何构建partB的代码}Product*getResult(){//返回最后组装成品结果}};ConcreteBuilderbuilder;Directordirector(&builder);director.construct();Product*product=builder.getResult();创建型模式Builder(生成器)效果可以改变一个产品的内部表示。将构造代码和表示代码分开。可以对构造过程进行更精细的控制。实现Builder类接口应足够普遍。产品通常不需要有公共抽象类。Builder中通常缺省方法为空。22创建型模式Prototype(原型)对象创建型模式意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。适用性当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者为了避免创建一个与产品类层次平行的工厂类层次时;或者当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。23创建型模式Prototype(原型)24创建型模式客户(Client)角色:客户类提出创建对象的请求。抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。具体原型(ConcretePrototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。25创建型模式Prototype(原型)效果可在运行时刻增加和删除产品。可以通过改变值来指定新产品。可以通过改变结构来指定新对象。减少了子类的构造。可以用类动态配置应用。实现使用一个原型管理器;实现克隆操作(浅拷贝和深拷贝);初始化克隆对象;参考阎宏的《JAVA模式》26创建型模式Singleton(单件)对象创建型模式意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。27创建型模式Singleton(单件)28实例详解结构型模式结构型模式的目的结构型模式涉及到如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。结构型对象模式描述了如何对一些对象进行组合实现新功能,并可以在运行时刻改变对象组合关系的一些方法。29AdapterBridgeCompositeDecoratorFacadeFlyweightProxy结构型模式Adapter(适配器)类/对象结构型模式意图将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适用性你想使用一个已经存在的类,而它的接口不符合你的需求。你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。30结构型模式角色:目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。源(Adaptee)角色:需要适配的类。适配器(Adapter)角色:把源接口转换成目标接口。根据这一角色的实现不同,可分为类适配器和对象适配器。31结构型模式Adapter(类适配器)类适配器是通过继承类适配者类(AdapteeClass)实现的,另外类适配器实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。32结构型模式Adapter(对象适配器)对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。33实例详解结构型模式Bridge(桥接)对象结构型模式意图将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过动态的结合实现解耦(GOF).比如说通过JDBC访问数据库,我们操作的API是基于接口的,是抽象,没有实现。而特定数据库提供的驱动测试

1 / 140
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功