每一个描述了一个在我们周围不断重复发生的问题以及问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。
模式要素:
- 模式名称。模式的一个助词名。
- 问题。模式应用的场景。
- 解决方案。描述了设计的组成部分,它们之间的相互关系及各自的职责和协作方式。
- 效果。描述了模式应用的效果及使用模式应权衡的问题。
模式分类
- 按目的原则,可分为创建型、结构型、行为型。
创建型与对象的创建有关;结构型处理类或对象的组合;行为型对类或对象怎样交互和怎样分配职责进行描述。 - 按范围原则,可分为类模式和对象模式。
客户请求是使用对象执行操作的唯一方法,操作又是对象改变内部数据的唯一方法。
型构:对象声明的每一个操作名、参数和返回值,一般我们讲的方法签名。
接口:对象所定义的所有操作型构的集合。
类型:用来标识特定接口的一个名字。
在面向对象系统中,接口是基本的组成部分,对象只有通过它们的接口才能与外界交互。对象接口与其功能实现是分离的,不同对象可以对请求做不同的实现。
动态绑定:发送给对象的请求和它的相应操作在运行时刻的连接。发送的请求直到运行才受具体的实现的约束。
多态:动态绑定允许你在运行时刻替换相同接口的对象。这种性质就是多态,多态允许客户对象仅要求其他对象支持特定接口。
理解对象的类class与类型type之间的差别是非常重要的。
- 对象的类定义的对象是怎样实现的,同时也定义的对象的内部状态和操作的实现。
- 对象的类型只与它的接口有关,接口即对象能响应的请求的集合。一个对象可以有多个类型,不同类的对象可以有相同的类型。
理解类继承和接口继承(实现)之间的差别也是十分重要的。
- 类继承根据一个对象的实现定义了另一个对象的实现,它是代码和表示的共享机制。
- 接口继承描述了一个对象什么时候能被用来替代另一个对象。
对接口编程,而不是以实现编程。
只根据抽象类中定义的接口来操纵对象有两个好处:
- 客户无须知道他们使用对象的特定类型,只须对象有客户所期望的接口
- 客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义接口的抽象类。
委托:是一种组合方法,它使组合具有与继承同样的复用能力。在委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给它的代理者。
一些导致重新设计的一般原因,以及解决这些问题的设计模式:
- 通过显示地指定一个类来创建对象。在创建对象时指定类名将使你受特定实现的约束而不是特定接口的约束,这会使未来的变化更复杂,要避免这种情况,应该间接创建对象。
设计模式:Abstract Factory, Factory Method, Prototype - 对特殊操作的依赖。当你为请求一个特殊的操作时,完成该请求的方式就固定下来了,为避免把请求代码写死,你将可以在编译时或运行时很方便地改变响应请求的方法。
设计模式:Chain of resposibility, Command - 对硬件和软件平台的依赖。
设计模式:Abstract factory, Bridge - 对对象表示或实现的依赖。知道对象怎样表示、保存、定位或实现的客户在对象发生变化时可能也需要变化。对客户隐藏这些信息能阻止连锁变化。
设计模式:Abstract factory,Bridge, Memento, Proxy - 算法依赖。算法在开发和复用时常常被扩展、优化和替代。依赖于某个特定算法的对象在算法发生变化时不得不变化。因此有可能发生变化的算法应该被孤立起来。
设计模式:Builder, Iterator, Strategy, Template Method, Visitor - 紧耦合。这样的类很难独立地被复用,因为它们是互相依赖的。
设计模式:Abstract factory, Command, Facade, Mediator, Observer, Chain of resposibility. - 通过生成子类来扩充功能。
设计模式:Bridge, Chain of resposibility, Composite, Decorator, Observer, Strategy - 不能方便地对类时行修改。
设计模式:Adapter, Decorator, Visitor
怎样选择设计模式:
- 考虑设计模式是怎样解决设计问题的
- 浏览模式的意图部分
- 研究模式怎样互相关联
- 研究目的相似的模式
- 检查重新设计的原因
- 考虑你的设计中哪些是可变的