设计模式
GOF设计模式
作用:在变化和稳定中间,寻找隔离点,从而管理变化
底层思维
- 语言构造
- 编译转换
- 内存模型
- 运行时机制
抽象思维
- 面向对象(封装,继承,多态)
- 组件封装
- 设计模式
- 架构模式
如何解决复杂性 “变化”
分解(分而治之) 抽象(重用性)
软件设计的目标:复用
管理变化,提高复用
高内聚松耦合
对象:有责任的抽象
面向对象设计原则
- DIP:依赖倒置原则(变化依赖于稳定,提出抽象类)
- 高层模块(稳定)和低层模块(变化)依赖于抽象(稳定)
- 实现细节(变化)依赖于抽象
- OCP:开放封闭原则(增加优于改变)
- 对扩展开放,对更改封闭
- 类模块是可扩展的,不可修改
- SRP:单一职责原则
- 一个类仅有一个引起它变化的原因
- 变化的方向隐含着类的责任
- LSP:Liskov替换原则
- 子类必须能够替换它们的基类(IS-A)
- 进程表达类型抽象
- ISP:接口隔离原则
- 接口小而完备
- 对象组合优于类继承
- 类继承:白箱复用;对象组合:黑箱复用
- 封装变化点
- 使用封装来创建对象之间的分界层
- 针对接口编程优于针对实现编程
- 接口标准化
Refactoring to Patterns
重构关键技法
差 优
静态 动态
早绑定 晚绑定
继承 组合
编译时依赖 运行时依赖
紧耦合 松耦合
稳定:非虚函数
变化:(纯)虚函数
扩展:继承+虚函数(多态)
设计经验
- 设计习语:Design Idioms
- 设计模式:Design Patterns
- 架构模式:Architectural Patterns
分类
目的
- 创建型(Creational)
- 结构型(Structural)
- 行为型(Behavioral)
范围
- 类模式处理类与子类的静态关系
- 对象模式处理对象间的动态关系
封装变化角度分类
“组件协作”模式:
典型模式
- Template Method
- Strategy
- Observer/Event
“单一职责”模式:
继承—>组合
典型模式
- Decorator
- Bridge
“对象创建”模式:
隔离类对象的使用者和具体类型(易变)之间的耦合关系 紧耦合,绕开new
典型模式
- Factory Method
- Abstract Factory
- Prototype
Builder
“对象性能”模式:
性能
典型模式
- Singleton
- Flyweight
“接口隔离”模式:
添加一层间接(稳定)接口
典型模式
- Facade
- Proxy
- Adapter
Mediator
“状态变化”模式:
典型模式
State
Memento
“数据结构”模式:
用接口代替封装的数据结构
典型模式
Composite
Iterator
Chain of Responsibility
“行为变化”模式:
解耦组件的行为和组件本身
典型模式
Command
Visitor
“领域规则”模式:
典型模式
Interpreter
Template Method
动机:稳定的整体结构,各子步骤有很多改变的需求
定义:定义一个算法的骨架(稳定),将变化到子类
早绑定 晚绑定
Strategy
动机:对象使用多种的算法,经常改变
定义:定义一系列的算法,并进行各个封装
扩展
动态的思考 时间轴
结构化:if-else switch-case
Observer
动机:通知依赖关系
定义:定义对象间的一种一对多的依赖关系
松耦合
基于事件的UI框架,MVC模式
Decorator
动机:过度地使用继承来扩展对象的功能
定义:运行时动态(组合)给一个对象增加一些额外的职责
消除重复代码,减少子类个数
同时继承和组合
解决主体类在多个方向上的扩展功能
Bridge
动机:多个维度的变化
定义:将抽象部分与实现部分分离,使得它们可以独立的变化
多个非常强的变化维度
Factory Method
动机:创建的对象的具体类型随需求变化而经常变化
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类
目的:解耦
手段:虚函数
Abstract Factory
动机:一系列相互依赖的对象
定义:提供一个接口
Prototype
动机:结构复制的对象
定义:使用原型实例指定创建对象的种类,通过clone这些原型来创建新的对象
Builder
动机:一个复杂对象
定义:将一个复杂对象的构建与其表示相分离
Singleton
动机:只存在一个实例
定义:
并发
Flyweight
动机:存储
定义:运用共享技术有效地支持大量细粒度的对象
评估内存开销
Facade
动机:组件的客户和组件中各种子系统有过多的耦合
定义:为子系统中的一组接口提供一个一致的界面
系统间
Proxy
动机:分布式,性能,安全
定义:
软件系统
Adapter
动机:旧对象到新环境
定义:将一个类的接口转换成另一个接口
对象适配器
接口兼容,类库迁移
Mediator
动机:多个对象互相关联交互,维持复杂的运用关系
定义:用一个中介对象封装一系列的对象交互
编译时依赖 运行时依赖
系统内
State
动机:对象行为随着状态改变
定义:
类似Strategy
Memento
动机:程序回溯到对象之前的状态
定义:不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
信息隐藏 序列化
Composite
动机:过于依赖对象内部实现结构
定义:将对象组合成树形结构,以表示“结构-整体”的层次结构
一致性
将”客户代码与复杂的对象容器结构“解耦
Iterator
动机:集合对象内部结构
定义:提供一种方法顺序访问一个聚合对象中的各个元素,不暴露对象的内部表示
泛型编程
Chain of Responsibility
动机:让请求的接收者自己在运行时决定处理请求
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将对象连成一条链,沿着链传递请求
Command
动机:行为请求者与行为实现者的“紧耦合”
定义:将请求封装为对象
Visitor
动机:类层次结构需要增加新的行为
定义:表示一个作业于对象结构中的各元素的操作
double dispatch
适用于类层次结构稳定,其中的操作改动频繁
Interpreter
动机:类似的结构不断重复出现
定义:给定一个语言,抽象为语法结构
经验之谈
- 不要为模式而模式
- 关注抽象类和接口
- 理清变化点和稳定点
- 审视依赖关系
- 要有Framework和Application的区隔思维
- 良好的设计是演化的结果
