基本准则
-
开放闭合原则
对扩展开放,对修改关闭
-
里氏代换原则
所有引用基类的地方,都必须透明地使用其子类的对象
-
依赖倒置原则
抽象不依赖细节,细节依赖抽象,面向接口编程
-
优先对象组合,而不是类继承
-
引用优于聚合
23种设计模式
gof-class gof-relative- 创建型模式与对象的创建有关
- 结构性模式与处理类或对象组合有关
- 行为型模式与类或对象怎么交互有关
创建型模式
抽象工厂
gof-abs-factor- 对工厂进行抽象
- 不同的工厂子类拥有不同的对象行为
- 客户端面向工厂接口编程
- 缺点是如果增加产品的种类,需要修改工厂的接口,破坏了开放闭合原则
Builder生成器
gof-builder- builder通过抽象出需要构建的不同part
- 不同的子类对part拥有不同行为
- 把builder的子类的对象赋予Director
- Director控制需要构建不同part的顺序与创建
- builder更关注子类的构建,有整体到局部的关系;而抽象工厂只关注子类的创建,而没有太关注整体局部的关系
- builder通常与composite一起使用
工厂方法
gof-factor- 工厂方法与抽象工厂非常类似
- 可以说工厂方法是抽象工厂的简化版
- 抽象工厂的一个工厂可以创建不同类型的子类;工厂方法一般只创建一种类型的子类
原型
gof-proto- 一般用于运行时,通过clone的方法,快速创建对象并操作,而不需要复杂的构造来构造新对象
单例
gof-singleton- 用于构建只能有一个对象的类
结构型模式
Adapter适配器
gof-adapter- 引入第三方接口时一般与系统不一致
- 通过继承引入子类
- 子类通过实现父类方法,并对第三方接口进行封装,实现扩展和接口复用
Bridge桥接
gof-bridge-1gof-bridge
- 实现与抽象分离
- XWindow和PWWindow是对不同的系统进行了细节的封装
- 当要构建一个新功能时,如果通过继承,则必须又构建对两个不同系统的细节封装
- 通过抽象出对不同系统下细节的封装放在一个类中
- 引入另外一个类,通过组合的方式,引用原来的细节封装类,进行解耦和复用
- 如果再又新的功能引入,只需要增加一个Windows子类,而不需要增加两个平台相关的WindowImp子类
Composite组合
gof-composite- 解决了部分和整体的对象关系表示
Decorator装饰器
gof-decorator- 在不影响其他对象的情况下,对某个子类新增加功能
- 可以避免子类数量爆炸,组合出非常多的子类操作
Facade外观
gof-facade- 封装细节
- 暴露统一简洁的API
Flyweight享元
gof-flyweight-samplegof-flyweight
- 通过对对象进行共享
- 来减少对象的个数
Proxy代理
gof-proxy- 适用远程代理
- 智能引用
- 保护代理
行为模式
Chain of responsibility职责链
gof-chain- 通过引用下一个对象的指针,可以把多个对象串联成一个链表
- 请求就可以顺着这个链,从头流到尾部
Command命令
gof-commangof-commands
- 对不同的业务,同一提供一个execute接口
- 可以非常方便的暴露同一接口
- 并组合调用
Interpreter解析器
gof-interpreter- 不同的子类拥有不同的解析行为
- 当某个子类需要其他子类协助才能进行解析的时候,通过调用其他子类的对象,进行复合解析
Interator迭代器
Mediator中介者
gof-mediator- 对不同的时间进行订阅
- 对不同的订阅用中介者来决定需要通知的对象
- 中介者内部维护了一个map
Memo
Observer观察者
gof-observer- 对象可以对感兴趣的事件进行订阅
- 观察者一旦有状态的变更,会把变更通知订阅者
State状态
gof-state- 每个子类是一个状态的表示
- 调用者维护状态之间的转换
- 对状态抽象出统一接口,方便调用
Strategy策略
gof-strategy- compositor负责对不同细节的封装和抽象
- Composition负责主体公共逻辑的实现
- 通过strategy实现了抽象与实现分离
Template method模板方法
c++的模板
Visitor访问者
gof-visitor- 一个类通常一份数据,对于不同的引用者,可能需要的内容,格式要求都不一样
- visitor对不同的内容提取者进行抽象,来避免对Element类的破坏
网友评论