初学者最常见的错误就是:背设计模式的代码。
比如“单例模式”。
设计模式的使用场景
设计模式是在已经有的代码基础上,进行重构。因为不是所有的代码都需要使用设计模式。
我们只会在经常发生变化的地方,使用设计模式。
设计模式的出现,也是为了应对变化,达到代码复用。
Reefactoring to Patterns重构获得模式
- 不应该先入为主, 一上来就使用设计模式.
- 没有一步到位的设计模式
- Refactoring to Patterns, 通过已有的代码进行重构, 从而选择模式
- 不可以做极端探讨,比如所有代码都在变化, 所有代码都不变化。 没有意义。
- 模式就是要找出,哪些是稳定的,那些是变化的
重构关键技法
下面对应的是: (老代码)–重构->(新代码)
- 静态 -> 动态
- 早绑定 -> 晚绑定
- 继承 -> 组合
- 编译时依赖 -> 运行时依赖
- 紧耦合 -> 松耦合
明确4个问题?
-
模式名称
方便我们思考和交流。 -
动机?
何时使用该设计模式? -
解决方案是什么?
设计组成成分,各成分的职责以及协作方式。 -
效果怎么样?
各个模式之间的权衡, 因为并不是一个模式就能完美解决问题,往往是多个模式混用,然后权衡。
按封装变化角度进行分类
分类 | 模式 | |||
---|---|---|---|---|
组件协作 | Template Method | Strategy | Observer/Event | |
单一职责 | Decorator | Bridge | ||
对象创建 | Factory Method | Abstract Factory | Builder | |
对象性能 | Singleton | Flyweight | ||
接口隔离 | Facade | Proxy | Mediator | Adapter |
状态变化 | Memento | |||
数据结构 | Composite | Iterator | Chain of Responsibility | |
行为变化 | command | Visitor | ||
领域问题 | Interpreter |
上面的各种变换某种意义上来说,是相同的意思,不同的表述
范围 分类
- 用于“类” : 编译时确定, 偏静态, 偏继承方案.
- 用于“对象”:运行时, 动态, 偏组合方案.