设计模式(Design Patterns)总结归纳

创建型模式

1 AbstractFactory 抽象工厂

关键词:多套方案

意图提供一个创建多套(每套有相应的一群对象)的方法

适用情况:1、一个系统由多个产品系列中的一个来配置2、强调一系列相关的产品设计。

结构:

 1

这里面AbstractFactory是抽象工厂,下面的两个是每套方案的工厂,每种工厂有相同的虚函数接口用来创建对象,也可以用于从文件读入配置来创建,右面的部分是产品,每个产品派生了在各套方案中不同的实现。

例子:创建不同的界面方案

Windows* w=new Windows();

Linux* L=new Linux();

void createUI(AF*a,File configure){

AF->……

};//AF是Windows和Linux的基类

当使用时传入w就是创建Windows的界面

备注:通常抽象工厂类的实例为单件。

2 builder 生成器

关键词:使用多种不同方案

意图:为一个应用提供不同的实现方法,通常这个应用者称为导向器,而不同的实现方法叫做生成器。

结构:

2

Director使用Builder来配置(实现),不同的Builder派生类实现不同的行为

3 Factory Method 工厂方法

关键词:子类产生对象

意图:定义一个创建对象的接口,让对不同类型的创建由它的不同子类来实现

结构:

3

例子:例如如果构建一个UI的产生器,可以定义一个基类UICreator,然后子类有buttonCreator、windowCreator等,在虚函数中实现不同的产生。

 

4 Prototype 原型

关键词:通过复制组合已有的对象来产生

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

结构:

4

这里每个原型类都要实现clone()这个虚函数,当需要产生原型的实例时,就调用这个clone()。

这与用直接用new()来产生对象的区别在于原型拷贝可以动态的复制对象的细节,new()只是创建一个默认参数的实体

5 Singleton 单件

关键词:只有一个

意图:程序中只能有这样一个实例,并且可以方便的全局的访问到它

结构:

5

代码示例:

6

备注:

1、通常如果涉及一个可复用的单件,常把类Sigleton涉及称模板,然后将你想要做成单件的类继承自他。

2、可以扩展成只有限制由N个实例的类。

 

结构型模式

1 Adapter 适配器(Wrapper)

关键字:转换接口以适用

意图:将一个已存在的接口转换成用户所希望的另一个接口

结构:

7

实现:对于类适配器通常共有继承自target,然后私有继承Adaptee(私有继承就是实现Adaptee的所有接口,是指都成为它的私有接口)

         对象适配器通常将Adaptor中添加一个Adaptee成员。

2 Bridge 桥接(handle/body)

关键字:抽象与实现分离

意图:对抽象和实现分离,然后分别扩充(派生)抽象部分与实现部分

结构:

8

3 Composite 组合

关键字:组合和单个对象有相同接口,无限组合

意图:将对象组合成树形以表示部分-整体层次结构,并且使得用户对组合对象的使用跟使用单个对象一样。

结构:

9

4 Decorator 装饰(Wrapper)

关键字:增加附加功能

意图:动态的给一个对象增添一些附加的功能,而不是使用子类继承

结构:

10

这里Decorater必须与它装饰的对象继承自一个基类,并有相同的接口,然后他维护一个指向他装饰的类的一个指针,为它的装饰的类的操作的前后添加额外的操作。

5 Facade 外观

关键词:给客户的一个视图

意图:给系统中一组接口提供一个一致的界面,通常是一个简单易使用的界面。是一些客户不必关心系统中更加复杂的实现细节。

结构:

11

6 Flyweight 享元

关键词:共享,池

意图:共享大量的细粒度对象

结构:

12

其中Flyweight只能由它的工厂创建并实例化,客户取得flyweight只能去工厂里寻找。

7 Proxy 代理

关键词:不实际操纵一个类

意图:为某个对象提供一个代理,让其他对象通过这个代理进行访问这个对象。

结构:

13

用途:1、某个对象的操作需要的开销很大

          2、远程、保护

          3.灵巧指针。

 

对象行为型模式

1 Chain of Responsibility 职责链

关键字:层级转发

意图:多个对象都有机会处理一个请求,而且通常这些对象之间是有层级关系的,可以将对请求的处理连成一条链,是请求沿着链传递,直到被处理。

结构:

14

既可以让一个父对象的处理器称为子对象处理器的后继,也可以反过来

Qt中的事件在父子对象间的传递就是用的这种模式

2 Commond 命令(Action/Transaction)

关键字:将请求包装成对象

意图:将一个请求的响应封装在一个对象中,在这个对象中包括所需要的操作

结构:

15

commond中要保存它所执行处理的对象的引用。

用途:1、可以相应一个菜单项的操作,例如Qt中的action类就是个命令类

         2、在commond中可以增加unexcuted和一个链表,保存各种状态,来支持任意次数的后退、前进操作

         3、支持从日志中恢复

3 Interpreter 解释器

4 Iterator 迭代器

结构:

16

迭代器已经在标准c++中了,所以c++有介绍它的大篇幅。

5 Mediator 中介

关键词:将联系变为对象

意图:用一个中介对象来表示各对象之间的交互,从而避免各对象之间的直接引用。因为通常在打的系统中,类月分散,他们之间的联系就越多,通常在类中定义与其他类的关系将导致这些类的生存要依赖于其他类,这里的中介对象封装他们之间的联系。

结构:

17

在这里collegue是这些需要相互交互的类,colleegue要在medistoer中北创建,同时collegue知道meditor的指针,同时concreatemediator也知道concreatecollegue的指针,collegue需要做一个动作的时候,会通知调用mediator,然后mediator调用其他的collegue的行为。

qt的信号与槽的机制应该与该模式有关。

6 Memento 备忘录

关键词:存储恢复历史状态

意图:在不破坏封装性的前提下,存储一个对象的内部状态,可以随时恢复这个对象的历史状态

结构:

18 

这里的caretaker(负责人)可以是一个撤销恢复系统,只有originator可以操纵memento,所以memento的成员函数处理析构都为私有,并把originator设为它的友元。

7 Observer 观察者(Dependencies/Publish—Subscribe)

关键词:相互依赖的对象间保持状态一致

意图:当一个对象的状态发生改变时,所有依赖于它的对象得到通知并被自动更新

结构:

19

这里observer依赖于subject,subject也可以依赖于observer,首先将observer加入subject的观察着队伍中,然后一旦subject的状态发生改变,他会使用notify来使所有的观察着update,这个notify也可以由一个观察着调用,观察着在update的时候会先检查一下状态是否和subject的一致。

使用的例子包括基于同样的数据(subject)绘制的不同类型的图标(observer),其中任何一个发生变动,其他的都会随之而动。

8 State 状态

关键词:类的状态决定他的表现行为

意图:允许一个对象在其状态发生改变时改变他的行为,例如很多的类有一个决定他性质的状态,这个状态完全决定了他的表现,就像tcp的类。

结构:

20

将类的状态定义成一个类,然后他的表现直接依赖于状态类的表现。

9 Stratagy 策略

关键词:封装不同的算法

意图:定义一个个算法,使得他们可以被封装起来,方便切换,并且使他们独立于客户而存在

结构:

21

实现上就是将这个算法编程一个基类,然后不同的算法为不同的派生类,共同实现一个接口,使用时只要用不同的派生类实现就是用不同的算法了,这样可以避免使用switch等语句。

10 Template 模板

关键词:通用算法抽取

意图:定义一个操作中算法的骨架,而将一些具体特定的实现推迟到子类中。

结构:

22

比如打开文档这一操作,可以将其定义为一个抽象算法,作为基类,然后不同文件的打开作为派生类,在派生类做不同文件的解析,这样可以避免使用switch。

11 Visitor 访问者

关键词:将类的接口拿出来当成服务

意图:有的时候一些类和其派生类可能要实现大量的接口,而这些接口的存在有可能导致类的庞大和可读性不好,或是并不是所有的派生类都要有这些接口,但是又有一部分需要这些接口。总之在一切你不想将这些接口实现在这个类中的时候。你可以将这些接口一个个的单独拿出来形成类,把他们封装成单独的针对某个类的服务(这个类为传入的参数),然后当某个类需要这个接口时,把这个服务给他。

结构:

23

 

将需要的接口封装成派生于visitor的派生类,然后将接口在这个类中实现。

posted on 2009-10-22 16:02  leonwei  阅读(196)  评论(0编辑  收藏  举报