9 设计模式
创建型
工厂方法Factory Method
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
定义创建产品接口,让子类决定何时实例化
有效封装产品类、调用者无须关心实例化过程,依赖工厂就能得到产品
Abstract Factory抽象工厂
问题
需要实例化一组相关的对象
实现
定义一个抽象类,将如何实例化对象,从使用对象者中提取出来
效果
使用哪些对象,与如何使用这些对象的逻辑分离
单例Singleton
确保一个类只有一个实例
节省内存、提高性能(减少创/销)
Builder(建造者)
复杂对象的构建与表示分离
有效封装变化、业务逻辑封装在导演类
Prototype(原型)
制定创建对象的种类,通过克隆原型创建新对象
结构型
Adapter适配器
问题
使控制范围外的一个原有对象与适配器(某接口)匹配
实现
对象模式:将不符规范类,包装(组合)后实现适配器(接口),保持适配器多态
类模式:定义新类,从定义其接口的抽象类公开继承、从访问其实现的原有类私有继承
效果
客户无需了解,即可以通用的方式处理细节,起到转换接口作用(不一定有简化)
Bridge桥接
问题
抽象类的派生类需要多个实现,但不能出现类数量爆炸的问题
实现
用一组抽象类,包装一组实现类,两者变化相互独立
例如:行为变化封装在抽象类,实现变化封装在实现类
效果
抽象部分与实现部分分离,使它们可以独立变化
装饰器Decorator
问题
在对象的基础功能之前/之后添加附加功能
实现
主体类与装饰类继承构件类,装饰类由构件类组成,装饰类派生出装饰类
效果
动态给一个对象添加额外的责任
外观Facade
问题
只需复杂系统的部分功能
希望封装/隐藏原系统
使用原系统功能,同时增加一些新功能
一人编写新类成本较小,所有人学习去维护原系统的成本较高
实现
定义一个/多个xxxFacade类,关联原系统类,终端Client关联xxxFacade即可
效果
便于改换系统,监视系统使用情况,减少处理对象数
组合Composite
将对象组合以树形结构表示“部分”与“整体”关系
享元Flyweight
使用共享技术支持大量细粒度的对象
Proxy(代理)
提供一种代理以控制对这个对象的访问
行为型
-----------------------------------------封装算法
Strategy策略
问题
定义一组算法,将每个算法封装(行为分离),相互可以互换(相同工作、实现不同)
实现
旧的实现
复制粘贴
重复使用switch或者if语句
继承,让派生类用新的方式处理
将整个功能委托给新类
新的实现
concretestrategyA/B/C分别继承Strategy实现不同策略,由Strategy组成Context供给Client
Template Method(模板方法)
定义操作中算法框架,将步骤延迟到子类
子类可以不改变算法结构,重定义算法步骤
-------------------------------------------对象交互
观察者Observer
问题
发生某事件时,需要通知多个对象
实现
为了交互对象的松耦合设计,主题(Subject)+观察者(Observer)=观察者模式
Observer观察者类向subject主题类注册,subject负责监听事件
效果
多对象同时监听一个主题,当主题改变,观察者会得到通知
中介者Mediator
问题
中介者封装对象交互,对象间不显示作用
使耦合松散,对象可以独立改变之间交互
实现
定制分布在各类中的行为,提供给各对象进行复杂的通信,各对象不用相互知道(添加对方)
效果
欲使一个后端数据模型能被多个前端用户界面连接
----------------------------------访问操作
Iterator(迭代器)
提供方法访问容器对象的各个元素,不暴露对象的内部细节
Visitor(访问者)
封装作用于数据结构的元素的操作
在不改变数据结构前提下,定义作用于元素的新操作
----------------------------------处理请求
Chain of Responsibility(责任链)
使多个对象都能处理请求
避免发送者、接收者之间的耦合
Command(命令)
把请求封装成对象,使用不同请求把客户端参数化
对排队/记录请求日志,可提供撤销和恢复功能
----------------------------------自我状态
State(状态)
对象内部行为根据状态改变而改变,提供“自改变”的方法
Memento(备忘录)
不破坏封装前提下,捕获对象内部状态,在外部保存,便于恢复状态
Interpreter(解释器)
定义语言、文法表示及解释器,用于解释语言中句子