设计模式解析
2012-03-04
优秀代码的目标:
* 高效
* 健壮
* 灵活
* 无冗余
* 可读
* 可测试
面向对象的一些原则和方法
* 内聚性(cohesion):例程中操作之间联系的紧密程度
* 耦合性(coupling):两个例程之间联系的紧密程度
* 软件开发的目标:高内聚、松耦合
* 发现变化并将其封装
1. 寻找变化,并将它封装在一个单独的类中
2. 将这个类包含在另一个类
* 当一个类处理越来越多不同变化时,代码的内聚性就会变得很差。即:它处理的特殊情况越多,可理解性就越差。
* 设计的两步法:1> 抽象类(共性)—— 需要什么接口来出来这个类的所有责任?2> 派生类(可变性)——对于这个给定的特定实现,应该怎样根据给定的规约来实现它?
* 处理新需求的选择: 1> 分析瘫痪;2> 放任自流; 3> 考虑变化的设计
* 考虑变化的设计
* 原则:针对接口编程,而不是针对实现编程
* 原则:优先使用对象组合,而不是类继承
* 原则:考虑设计中什么应该是可变的
* 防止“分支蔓延”
* 一条规则,实现一次
组合起来:用模式思考
* Alexander: 设计应该从问题的一个简单陈
* 述开始,然后通过在这个陈述中加入信息,使它更加详细(也更加复杂)。一种基于模式的方法(《建筑的永恒之道》),
1. 从整体的概念性理解开始,以理解需要实现的目标
2. 找到整体中出现的模式
3. 从为其它模式创造背景的那些模式开始
4. 从背景向内:应用这些模式,找到新的模式,并重复
5. 最后,通过每次应用一个模式,改进设计,并在所创建的背景中予以实现
* 用模式思考的过程:
1. 找出模式
2. 分析和应用模式
* 按背景的创建顺序将模式排序
* 选择模式并扩展设计
* 找到其它模式
* 重复
3. 添加细节
* 考虑背景时候的一条规则:先考虑系统中需要什么,然后再去关注如何创建它们
* 背景和被使用的关系:当一个模式使用另一个模式时,被使用的模式就处于使用模式的背景中
设计模式的策略:
* 从背景设计
* 在类中封装变化
设计模式的原则:
* 开闭原则——模块、方法和类应该对扩展开放,对修改封闭。换言之,软件应该设计成不加修改缘由代码就能扩展功能。
* 依赖倒置原则——其背后的理念是在设计细节之前先创建总体概念。高层模块不应该依赖底层模块。相反,它们都应该依赖于抽象。
* 理性怀疑原则——小心过分依赖模式。概念层次的模式和模型都是真理的抽象。它们是已往经验和教训的结晶。使用它们来帮助我们思考摆在前面的问题。
共性与可变性分析(CVA):
1. 先寻找共性
2. 从这些共性创建抽象
3. 从共性的变化寻找派生
4. 看共性之间的关系如何
分析矩阵:
1. 找到某种特定情况中最重要的特性,并用矩阵将它们组织起来。用特性所表示的概念为每个特性标记。
2. 继续处理其它情况,安需要扩展这个矩阵。处理每一情况时应该独立于其它情况。
3. 用新的概念扩展该分析矩阵
4. 用行发现规则
5. 用列发现实现
6. 从这种分析中确定模式
7. 得到高层设计
对象创建和管理规则:对象应该要么构造和/或管理其它对象,要么使用对象,而不应该兼而有之。
常见的设计模式:
* Facade
* Adapter
* Strategy
* Bridge
* Abstract Factory
* Decorator
* Observer
* Template Method
* Singleton 和 Double-Checked Locking
* Object Pool
* Factory Method