软件设计的核心是抽象,抽象贯穿整个软件设计过程,不同的职责站在不同的层次和角度进行抽象。而模式是对同类型问题的一种抽象和高度概括。
设计模式是应对需求频繁变化带来的负面影响,其中心思想就是解耦,减少模块间的依赖,使各模块可以独立变化。解耦是目的,抽象是解耦的方式和手段。
- 单一职责原则
一个类仅有一个引起它变化的原因
- 里氏替换原则
子类替换基类时,原有程序不用更改
- 依赖倒置原则
抽象不应该依赖于细节,细节应当依赖于抽象(要针对接口编程,而不是针对实现编程)
- 接口隔离原则
接口应该尽量小和单一
- 开闭原则
对于扩展是开放的,对于修改是封闭的
- 迪米特原则
一个对象应当尽可能少的去了解其他对象
原则是对具体设计模式的抽象(又见抽象),其实就是面向对象设计的日常原则。值得一提的是,无论设计模式还是原则,只是作为一个指导参考,不必非要死搬硬套,合理就好。
学习技术,还是偏向于从全局到局部,再深入到细节,这样才不会迷失。
要理解设计模式,首先要理解抽象,再理解设计原则,然后结合项目经验找到软件设计的痛点,最后深入设计模式细节。
另外,设计模式是演变过来的,不是出生那天就固定了,所以了解模式的演变对理解设计模式更有意义。
学习设计模式需要的基础知识:
1. 熟悉面向对象的概念
2. 熟悉接口、泛化、多态、继承、组合等概念
3. 对抽象、依赖、解耦的概念有过独立思考
4. 对设计模式原则有所了解
具体学习方式:
1. 了解设计模式分类,每种分类解决什么类型的问题
2. 先学习基础的、简单的设计模式,再学习其他演变的模式
3. 将所有设计模式熔炉,抽象化、理论化
如何在项目中实战:
1. 寻找项目中的业务变化点
2. 思考如果对频繁变化点进行抽象封装
3. 对比自己的实现与经典设计模式有何差异
学习顺序(从简单到复杂):
1. 单例模式
2. 工厂方法、模板方法
3. 抽象工厂
4. 观察者
5. 代理
6. 中介者、原型
7. 状态、策略
8. 外观、享元
9. 适配器、迭代器
10. 组合、装饰
11. 命令、备忘录
12. 责任链、访问者
13. 生成器、桥接
14. 解释器
书籍推荐只有两本:Head First设计模式
和设计模式(GOF)
,其他书籍不看也罢,看了也许还会起误导作用。两本书的顺序是初学看Head First设计模式
,如果有底子直接看设计模式(GOF)
。
设计模式很不好讲,为了简化设计模式的理解,尽量将 demo 裁剪的简单直接。因此有的示例无法充分说明该设计模式的威力(以学习目的为主)。
另外一个头疼的问题是很难找到合适的示例,要么例子和设计模式不紧密,要么需要很多代码才能表述清楚。示例的选择大致来源三处:
四人帮的设计模式示例
head first 设计模式示例
网上搜索