常见设计模式:
1.抽象工厂: 通过指定对象组的种类而非单个对象的类型来支持创建一组相关的对象
2. 适配器: 把一个类的接口转变成为另一个接口
3. 桥接: 把接口和实现分离开来,使他们可以独立地变化
4. 组合: 创建一个包含其他同类对象的对象,使得客户代码可以与最上层对象交互而无需考虑所有的细节对象
5. 装饰器: 给一个对象动态地添加职责,而无需为了每一种可能的职责配置情况去创建特定的子类(派生类)
6. 外观: 为没有提供一致接口的代码提供一个一致的接口
7. 工厂模式: 做特定基类的派生类的实例化时,除了在工厂模式内部之外均无需了解各派生对象的具体类型
8. 迭代器: 提供一个服务对象来顺序地访问一组元素中的各个元素
9. 观察者: 使一组相关对象相互同步,方法是让另一个对象负责:在这组对象中的任何一个发生变化时,由他把这种变化通知给这个组里的所有对象
10. 单件: 为有且仅有一个实例的类提供一种全局访问的功能
11. 策略: 定义一组算法或者行为,使得他们可以动态地相互替换
12. 模板方法: 定义一个操作的算法结构,但是把部分实现的细节留给子类(派生类)
关于设计启发的总结:
▲ 寻找现实世界的对象
▲ 形成一致的抽象
▲ 封装实现细节
▲ 在可能的情况下继承
▲ 藏住秘密(信息隐藏)
▲ 找出容易改变的区域
▲ 保持松散耦合
▲ 探寻通用的设计模式
下列启发式方法有时也有用:
▲ 高内聚性
▲ 构造分层结构
▲ 严格描述类契约
▲ 分配职责
▲ 为测试而设计
▲ 避免失误
▲ 有意识的选择绑定时间
▲ 创建中央控制点
▲ 考虑使用蛮力
▲ 画一个图
▲ 保持设计模块化
核对表:软件构造中的设计
设计实践
▲ 你已经做过多次迭代,并且从众多尝试结果中选择最佳的一种,而不是简单选择第一次尝试的结果吗?
▲ 你尝试用多种方案来分解系统,以确定最佳方案吗?
▲ 你同时用自下而上和自上而下的方法来解决设计问题吗?
▲ 为了解决某些特定的问题,你对系统中的风险部分或者不熟悉的部分创建过原型、写出数量最少的可抛弃的代码吗?
▲ 你的设计方案被其他人检查了吗(无论正式与否)?
▲ 你一直在展开设计,直到实施细节跃然纸上了吗?
▲ 你采用某种适当的技术——比如wiki、电子邮件、挂图、数码照片、UML、CRC卡或者在代码中写注释——来保留设计成果吗?
设计目标
▲ 你的设计是否充分地处理了由系统架构层定义出并且推迟确定的事项?
▲ 你的设计被划分为层次吗?
▲ 你对把这一个程序分解为子程序、包和类的方式感到满意吗?
▲ 你把对这个类分解成为子程序的方法感到满意吗?
▲ 类与类之间的交互关系是否已设计为最小化了?
▲ 类和子程序是否被设计为能够在其他的系统中重用?
▲ 程序是不是易于维护?
▲ 设计是否精简?设计出来的每一部分都绝对必要吗?
▲ 设计中是否采用了标准的技术?是否避免使用怪异且难于理解的元素?
▲ 整体而言,你的设计是否有助于最小化偶然性和本质性的复杂度吗?