章七 设计模式
一、设计模式的分类1、共包含23个设计模式1)Abstract Factory提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2)Adapter将一个类的接口转换成客户希望的另一个接口。3)Bridge将抽象部分与实现部分分离,使它们可以独立变化。4)Builder将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。5)Chain of Responsibility为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。6)Command将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化。7)Composite将对象组合成树形结构以表示“整体-部分”的层次结构,使客户对单个对象和复合对象的使用具有一致性。8)Decorator动态地给一个对象添加一些额外的职责。9)Facade为子系统中的一组接口提供一个一致的界面。10)Factory Method定义一个用于创建对象的接口,让子类决定将哪一个类实例化。11)Flyweight运用共享技术有效的支持大量细粒度的对象。12)Interpreter给定一个语言,定义其文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。13)Iterator提供一种方法顺序访问一个聚合对象中各个元素,而不需暴露该对象的内部表示。14)Mediator用一个中介对象来封装一系列的对象交互。15)Memento在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。16)Observer定义对象间的一对多的依赖关系,以便当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。17)Prototype用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。18)Proxy为其它对象提供一个代理以控制这个对象的访问。19)Singleton保证一个类仅有一个实例,并提供一个访问它的全局访问点。20)State允许一个对象在其内部状态改变时改变它的行为。21)Strategy定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。22)Template Method定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。23)Visitor表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作。2、各模式详述1)Abstract Factory-对象创建模式意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。为保证可移植性,一个应用不能为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感。解决方法:(1)定义一个抽象的WidgetFactory类;(2)声明一个创建每一类基本窗口组件的接口;(3)每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格;(4)对每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件实例。适用性:(1)一个系统要独立于它的产品的创建、组合和表示时;(2)一个系统要由多个产品系列中的一个来配置时;(3)要强调一系列相关产品的对象设计以便进行联合使用时;(4)提供一个产品类库,而只想显示它们的接口而不是实现时。参与者:(1)AbstractFactory(WidgetFactory) 声明一个创建抽象产品对象的操作接口(2)ConcreteFactory(MotifWidgetFactory,PMWidgetFactory) 实现创建具体产品对象的操作;(3)AbstractProduct(Windows,ScrollBar) 为一类产品对象声明一个接口。(4)ConcreateProduct(MotifWindow,MotifScrollBar) 定义一个被相应的具体工厂创建的产品对象,实现接口;(5)Client 仅使用AbstractFactory和AbstractProduct类声明的接口。优缺点:(1)分离了具体的类;(2)使得易于交换产品系列;(3)有利于产品的一致性;(4)难以支持新种类的产品。实现:(1)将工厂作为Singleton;(2)创建产品;(3)定义可扩展的工厂。代码示例:class Mazefactory{public:MazeFactory();virtual Maze* MakeMaze() const{return new Maze;}virtual Wall* MakeWall() const{return new Wall;}virtual Room* MakeRoom(int n) const{return new Room(n);}virtual Door* MakeDoor(Room* r1, Room* r2) const{return new Door(r1,r2);}};