第一次系统学习设计模式的时候,我还在学校里。买的书是《设计模式–可复用面向对象软件的基础》翻译过来的,机械工业出版社,2005年12月第1版。当时的感觉就是醍醐灌顶,这些老外太牛了。
自己在代码中使用的模式真不多,在各种库中看到不少,具有设计模式思想的东西不少。
最近有时间,把这本书又过了一遍,新的体会:文章组织和翻译不太好啊(有的字句不太好理解啊,每个模式的应用实例我基本不知道啊,也许是原文就这样(没看过英文原版));学习模式要掌握其精髓,类的组织也不完全是死的,要灵活掌握,也可以灵活变化;新的感觉是它们也不是万能的,也有局限和不足。
每一个设计模式,描述了一个不断重复发生的问题,及其解决方案的核心。这样,针对这类问题,就可以重用这个解决方案。
对象是对现实世界的抽象,可以是物,可以是一个操作,可以是一种关系,也可以是一个状态,等等;抽象的粒度可以很大,也可以很小。
对象的类型只与它的接口有关。接口指类或对象能响应的请求的集合。对象与外界唯一的交互方式就是它的接口;读取和改变对象的状态的唯一方式也是调用他的接口。
相同接口的对象可以有不同的实现(接口和实现分离),所以才会有动态绑定(调用接口的请求编译时就确定的,但它的实现(或者叫包含实现的对象)是运行时确定的,所以叫动态绑定),进而才有多态(动态绑定不同的对象,从而调用他们不同的实现)。
继承分为实现继承和接口继承,C++中公有继承纯抽象类或者公有继承父类中的纯虚函数,就叫接口继承;实现继承包括了继承父类的protected方法等。C++中通常同时用到实现继承和接口继承。
代码复用机制:继承(缺省实现,实现继承),对象组合,参数化类型即模板。
我理解设计模式的最大一个思想是封装变化,需要考虑现实问题中哪些是可变的,设计中应该支持哪些变化。下面从每个模式封装变化和实际应用实例这两个方面总结一下:
创建型模式:与对象的创建有关,隐藏了被用来创建的具体的类的信息,隐藏了如何创建的信息。这些创建类模式就能灵活地支持什么被创建,谁创建,怎样创建,何时创建等。
- Abstract Factory(抽象工厂):
可变部分:创建不同的产品系列(每个系列包括多个不同的产品) - Builder(生成器):
可变部分:用不同的方式方法创建组合对象? - Factory Method(工厂方法):
可变部分:创建不同的子类对象? - Prototype(原型):
可变部分:创建不同的类对象 Singleton(单体):
可变部分:不允许给一个类创建多个实例,只创建一个实例
结构型模式:类或对象的组合Adapter(适配器):
可变部分:对象接口,把不同的对象接口适配成一个需要的接口- Bridge(桥接):
可变部分:对象的实现,支持对象的实现发生变化 - Composite(组成?):
可变部分:对象的结构和组成??支持对象的组成发生变化 - Decorator(修饰):
可变部分:对象的职责,支持对象职责发生变化 - Facade(外观):
可变部分:一个子系统的接口,与Adapter区别?? - Flyweight(享元):
可变部分:对象的存储开销?? Proxy(代理):
可变部分:如何访问一个对象,对象的位置
行为型模式:类或对象之间的交互Chain of Responsibility(职责链):
可变部分:响应一个请求的对象- Command(命令):
可变部分:何时、怎样满足一个请求 - Interpreter(解释器):
可变部分:一个语言的文法及解释 - Iterator(迭代器):
可变部分:遍历访问一个容器中元素的方法 - Mediator(中介者):
可变部分:对象间怎样交互、和谁交互 - Memento(备忘录):
可变部分:一个对象中哪些私有信息存放在对象之外,以及什么时候进行存储 - Observer(观察者):
可变部分:多个对象依赖于另外一个对象,它们如何通信保持一致状态 - State(状态):
可变部分:对象的状态,(及状态对应的行为) - Strategy(策略):
可变部分:算法,跟Bridge的区别 - Template Method(模板方法):
可变部分:算法中的某些步骤 - Visitor(访问者):
可变部分:作用于一个(组)对象的可读操作