读完了〈设计模式〉,确实是一本好书,现在来做一个总结。
设计模式书中的内容分为创建型,结构型,行为模式。
个人认为创建型模式是最容易理解的。下面就记录一点另外两种模式的内容。
结构型模式:
1,Adapter模式主要是为了解决两个已有接口之间不匹配的问题,Bridge模式则对抽象接口与它的(可能是多个)实现部分进行桥接。Adapter模式在类已经设计好后实施;而Bridge模式在设计类之前实施。
2,Facade定义一个新的接口,而Adapter则复用一个原有的接口。
3,Composite模式和Decorator模式具有类似的结构图,这说明它们都基于递归组合来组织可变数目的对象。Decorator旨在使你能够不需要生成子类即可给对象添加职责。这就避免了静态实现所有功能组合,从而导致子类急剧增加。Composite则有不同的目的,它旨在构造类,使多个相关的对象能够以统一的方式处理,而多重对象可以被当作一个对象来处理。它重点不在于修饰,而在于表示。
4,Proxy模式不能动态地添加或分离性质,它也不是为递归组合而设计的。它的目的是,当直接访问一个实体不方便或不符合需要时,为这个实体提供一个替代者。
行为模式:
1,封装变化
封装变化是很多行为模式的主题。当一个程序的某个方面的特征经常发生改变时,这些模式就定义一个封装这个方面的对象。这样当该程序的其他部分依赖于这个方面时,它们都可以与此对象协作。这些模式通常定义一个抽象类来描述这些封装变化的对象,并且通常该模式依据这个对象 来命名。
例如:
一个strategy对象封装一个算法。
一个state对象封装一个与状态相关的行为。
一个mediator对象封装对象间的协议。
一个iterator对象封装访问和遍历一个聚集对象中的各个构件的方法。
这些模式描述了程序中很可能会改变的方面。大多数模式有两种对象:封装该方面特征的新对象,和使用这些新的对象的已有对象。如果不使用这些模式的话,通常这些新对象的功能就会变成这些已有对象的难以分割的一部分。
但不是所有的对象行为模式都象这样分割功能。例如, Chain of Responsibility可以处理任意数目的对象(即一个链),而所有这些对象可能已经存在于系统中了。职责链说明了行为模式间的另一个不同点:并非所有的行为模式都定义类之间的静态通信关系。职责链提供在数目可变的对象间进行通信的机制。
2,通信应该被封装还是被分布Mediator和Observer是相互竞争的模式。它们之间的差别是, Observer通过引入Observer和Subject对象来分布通信,而Mediator对象则封装了其他对象间的通信。
3,对发送者和接收者解耦
命令、观察者、中介者,和职责链等模式都涉及如何对发送者和接收者解耦。Command对象提供了一个提交请求的简单接口,将发送者与接收者解耦,使发送者更易于复用。观察者模式通过定义一个接口来通知目标中发生的改变,从而将发送者(目标)与接收者(观察者)解耦。当对象间有数据依赖时,最好用观察者模式来对它们进行解耦。中介者模式让对象通过一个Mediator对象间接的互相引用,从而对它们解耦。职责链模式通过沿一个潜在接收者链传递请求而将发送者与接收者解耦。
4,模式的交叉使用
除了少数例外情况,各个行为设计模式之间是相互补充和相互加强的关系。例如,一个职责链中的类可能包括至少一个 Template Method的应用。该模板方法可使用原语操作确定该对象是否应处理该请求并选择应转发的对象。职责链可以使用Command模式将请求表示为对象。Interpreter可以使用State模式定义语法分析上下文。
迭代器可以遍历一个聚合,而访问者可以对它的每一个元素进行一个操作。行为模式也与能其他模式很好地协同工作。例如,一个使用Composite模式的系统可以使用一个访问者对该复合的各成分进行一些操作。它可以使用职责链使得各成分可以通过它们的父类访问某些全局属性。它也可以使用Decorater对该复合的某些部分的这些属性进行改写。它可以使用Observer模式将一个对象结构与另一个对象结构联系起来,可以使用State模式使得一个构件在状态改变时可以改变自身的行为。复合本身可以使用Builder中的方法创建,并且它可以被系统中的其他部分当作一个Prototype。