一、什么是设计模式
“ 每一个模式描述了一个在我们周围不断重复发生的问题以及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动 ”
从面向对象谈起
这里有两个思维模型:
底层思维:向下,如何把握机器底层从微观理解对象构造
- 语言构造
- 编译转换
- 内存模型
- 运行时机制
抽象思维:向上如何将我们的世界抽象成程序代码
- 面向对象
- 组件封装
- 设计模式
- 架构模式
在某种程度上抽象思维比底层思维更加重要,但是光有抽象思维没有底层思维是不够的。
深入理解面向对象
向下:
- 封装,隐藏内部实现
- 继承,复用现有代码
- 多态,改写对象行为
向上:
深刻把握面向对象机制所带来的抽象意义理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”
软件设计复杂的根本原因:变化
- 客户需求的变化
- 技术平台的变化
- 开发团队的变化
- 市场环境的变化
…
如何解决复杂性
分解
人们面对复杂性有个常见的做法:即分而治之,将大问题化解为多个小问题,将复杂问题化解为多个简单问题
抽象
更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择它的非本质细节,而去处理泛化和理想化了的对象模型
软件设计的目标:复用
GOF-23模式分类
从目的来看
**创建型(Creational)模式:**将对象的部分构建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击
**结构性(Structural)模式:**通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击
**行为型(Behavioral)模式:**通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击
从范围来看
类模式处理类与子类的静态关系
对象模式处理对象间的动态关系
重构获得模式 Refactoring to Patterns
面向对象设计模式是 ” 好的面向对象设计 “ ,所谓 ” 好的面向对象设计 “ 指是那些可以满足 ” 应对变化,提高复用 “ 的设计
现代软件设计的特征是 " 需求的频繁变化 "。设计模式的要点是” 寻找变化点 ,然后在变化点处应用设计模式,从而更好地应对需求的变化" , "什么时候、什么地点应用设计模式 ” 比 “ 理解设计模式结构本身 ” 更为重要。
设计模式的应用不宜先入为主,一上来就使用设计模式是对是设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的 “ Refactoring to Patterns " 是目前普遍公认的最好的使用设计模式的方法
重构关键技法
- 静态->动态
- 早绑定->晚绑定
- 继承->组合
- 编译时依赖->运行时依赖
- 紧耦合->松耦合
”组件协作“模式
现代软件专业分工之后的第一个结果是 “框架与应用程序的划分” ,”组件协作“模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
典型模式
- Template Method
- Strategy
- Observer / Event