9 设计模式

优质
小牛编辑
119浏览
2023-12-01

创建型

工厂方法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(解释器)

定义语言、文法表示及解释器,用于解释语言中句子