1. 设计模式分类。
设计模式在粒度和抽象层次上各不同,以有效的方式组织起来便于对各族相关的模式进行引用,同时也便于发现新的设计模式。
分类原则:
(1) 目的准则: 根据模式是用来完成什么工作的来划分。
创建型: 与对象的创建相关。
结构型: 处理类和对象的组合。
行为型: 对类或对象怎样交互和怎样分配职责进行描述。
(2) 范围准则: 指定模式主要是用于类还是用于对象。
类模式: 处理类和子类之间的关系,这些关系通过继承建立, 是静态的,在编译时刻便确定下来了。
对象模式: 处理对象间的关系,这些关系在运行时刻是可以变化的,具有动态性。
从某种意义上来说, 几乎所有模式都是使用继承机制, 所以“类模式” 只指那些集中于处理类间关系的模式,而大部分模式都属于对象模式的范畴。
2. 设计模式的组织方式:
创建型类模式将对象的部分创建工作延迟到子类, 创建型对象模式将它延迟到另一个对象中。
结构型类模式使用继承机制来组合类,结构型对象模式描述了对象的组装方式。
行为型类模式使用继承描述算法和控制流,行为性对象模式描述一组对象怎样协作完成单个对象无法完成的任务。
有其他组织模式的方式, 有些模式会绑定在一起使用, 如: Composite 常和Iterator,Visitor一起使用; 有些模式是可替代的, 如:Prototype常用来替代Abstract Factory;有些模式尽管使用意图不同,但设计结果很相似,如:Composite 和 Decorator 结构图是相似的。
从多角度去思考设计模式,有助于对其功能,差异和应用场合有更深入的理解。
3. 设计模式怎样解决设计问题:
(1) 寻找合适的对象
客户请求是使对象执行操作的唯一方法,操作是对象改变内部数据的唯一方法。
面向对象最困难的部分是将系统分解成对象的集合,因为要考虑许多因素: 封装,粒度,依赖关系,灵活性, 性能, 演化, 复用等,而且它们经常是互相冲突的。
面向对象的设计学支持许多设计方法, 如:(1) 写出问题描述,挑出名词和动词,进而创建相应的类和操作;(2) 关注系统的协作和职责关系; (3) 对现实世界建模,再将分析时发现的对象转化到设计中。
设计的许多对象来源于现实世界的分析模型,但是,设计结果所得到的类通常在现实世界中并不存在,如数组类这样的低层类。Composite模式引入了统一对待现实世界中并不存在的对象的抽象方法,严格反映当前现实世界的模型并不存能产生也能反映将来世界的系统。
设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如:
描述过程或算法的对象,在现实世界中不存在,但是它却是设计的关键部分。
Strategy模式描述了怎样实现可互换的算法族, Strategy模式将实体的每个状态描述为一个对象,这些对象在分析阶段,甚至设计阶段的早期都并不存在,后来为了使设计更加灵活,复用性更好才将其发掘
(2) 决定对象的粒度
对象在大小和数目上差异大。
设计模式描述了一个对象应该是什么,粒度有多大。
Facade模式描述了怎样用对象表示完整的子系统;Flyweight 模式描述了如何支持大量的最小粒度的对象 ,其他一些设计模式描述将一个对象分解成许多小对象的特定方法。
Abstract Factory和Builder 模式产生那些专门负责生成其他对象的对象; Visitor 和Command 生成的对象专门负责实现对其他对象或对象组的请求。
(3) 指定对象接口
对象的接口描述了该对象所能接受的全部请求的集合。当给对象发生请求时,所引起的具体操作既与请求本身相关,又与接受对象相关, 支持相同请求的不同对象可能对请求激发的操作有不同的实现。
(4) 描述对象的实现
(5) 运用复用机制
(6) 关联运行时刻和编译时刻的结构
(7) 设计应支持变化