参考的博客:http://blog.csdn.net/wangeen/article/details/8272501
最近又把设计模式翻了一边,写个个人总结,这个总结比较简单,主要是一些理解,对于他们的实现和应用以后再总结
设计模式是编程抽象化的一个具体的应用,它让程序更好的阅读和理解,逻辑上更加合理,是通向更大规模软件的一个基础,换个说法,如果一个软件的模式很混乱那么它混乱到一定的程度就再也编写和维护不下去了,一直觉得Java c#的设计模式体现得更好,这是因为和他们的一切都是对象的理念比较一致,c++的稍微少一些,但是同样重要。
设计模式在大体上分3种
1. 如何构造对象而采用的模式(creational pattern)
2. 对象本身如何进行组织优化的模式(structure pattern)
3. 对象之间的行为如何管理的模式(behavioral pattern)
creational pattern主要有如下几个帮助构造对象的pattern,
1. abstract factory, 一个抽象工厂类可以派生出很多具体的工厂类;一个抽象产品类可以派生出很多具体的产品类;
其核心就是创建很多的product对象,然后在用一个factory对象里面构造很多createProduct的方法,使用起来也很简单,就是调用这一系列的create function,隐藏了对具体的对象的new, 另外factory通常都是singleton, 这个模式还有一个顺带的好处就是可以很方便的切换不同的product family, 这个模式使用可以提高程序的观感和可读性,一个文件的list对所有的对象的创建都包含了。
2. builder, 把复杂对象的构造和表示分离,所谓的构造就是builder中的一系列的method,这个pattern在anuvad中用得很好, 这个模式其实和abstract factory很类似,区别就是这里把一个复杂的对象分成好多step来构造,而abstract factory是一系列的小对象,也就是这里的step相当于那里product family中的一个。
3. factory method, 一个工厂类根据传入的参数创建对应的产品类;
就是提供一些method来创建具体的对象,常用的比如创建一个default的对象,或者根据一个id来决定来用哪个method。
4. prototype,通过copy一些具体的对象实例来构造新对象,是一种相对实例化的结构,注意每个product都要实现copy function,这个模式的理解还不透彻。
5. singleton:全局代码之间只有一个实例,需要做好保护。
structure pattern主要有如下几种优化组织结构的方法。
1. adaptor,就是用多重继承的方式让一个已有的对象能支持别的对象的接口。
2. bridge, 就是将一个对象拆成两个,一个是abstraction(比较稳定的部分接口面对客户),另一个是implementation, QT当中有很多这样的pattern
3. composite, 就是一个对象,包含了一个对本身的list,这样就构成了一个tree, 然后对要用的函数对这个list进行实现,对于单个和整体的处理可以用统一的接口,此pattern和chain of reponsibility关联很紧。
4. decorator, 对已有对象构造一个decorator,然后继承这个对象扩展一些功能, B= decorator(A),那么B具有了A和扩展的一些功能。
5. facade, 对应用库提供了一些更高层次的接口的抽象,提供更简单的接口,这个模式的理解还不透彻。
6. flyweight, 对大量的重复使用的对象缓存,建立一个map, 当要使用的时候先查看有没有有就不要创建了,http://supercrsky.iteye.com/blog/372714
7. proxy, 对一个已有的class再次封装,控制对这个对象的访问,和decorator很类似,但是一个是扩展功能,一个是限制,实现很类似但是更多的是架构上的不一致
behavioral pattern, 描述了对象之间的行为,其封装的核心即行为本身也可以是对象
1. chain of responsibility 所有的class 都继承同一个动作,每一个class都对同一个动作作出响应,比如打印log, 一个接一个,用起来很方便
2. command, 把action作为一个对象,里面有一个要处理的对象的指针,可以用来纪录操作和(re)do
3. interpreter, 打造自己的语言解释器,每一个语法作为一个对象
4. iterator, stl里面有实现,用起来真的很方便
5. mediator, 构造一个class,可以将子class的变动相互通知,比如GUI中的组合控件
6. memento, 本质就是一个保存瞬时状态的structure, 可以进行还原, 和command一起使用来实现redo功能
7. observer, MVC架构实现的核心pattern, 和mediator很相似,只是这个一对多,另一个是任意组合。
8. state, 传说中的状态机, 最常见的例子是TCP的状态的转换,用户只要面对一个简单的接口,每个状态是一个class, 所有的状态的转换都在各个class内自动完成。
9. strategy, 把算法分装成对象,A=new B(算法 N)
10. template method, 把算法切割很几步,把其中几步退化(defer)到子class中去做
11. vistor,构造一个vistor对象, 每个对象在vistor中都有一个对应的函数, vistor和对象相互耦合,不改变原来对象就可以访问它
E::accept(V&v){v.vE(this)};
boost中有一些设计模式的模板,比如abstract factory, 按照他们的说法就是abstract factory有很多冗余的代码,用template会很简单,另外还有flyweight, 设计得比较好作为一种allocate和其他的stl容器配合使用非常方便,也很节省内存,另外model c++里面用template的policy和traits来实现了很多的设计模式,这有个好处就是一次设计永远有用。