设计模式


设计模式是软件开发过程中面临的一般问题解决方案,每种模式都描述了一个我们周围不断重复发生的问题,以及该问题的核心解决方案。

设计模式主要分三种类型:

  • 创建型:主要解决对象的创建问题,封装复杂的创建过程量,解耦对象的创建代码和使用代码
  • 结构型:主要通过类对象的不同组合,解耦不同功能的耦合
  • 行为型:主要解决的是类或对象之间的交互行为的耦合
类型 模式 说明 适用场景
创建型 单例 一个类只允许创建一个实例或对象,并为其提供一个全局的访问点 无状态、全局唯一、控制资源访问
工厂抽象工厂 创建一个或者多个相关的对象,而使用者不用关心具体的实现类 分离对象的创建和使用
建造者 用于创建一种类型的复杂对象,通过设置不同的可选参数进行“定制化” 对象的构造参数较多且多数可选
原型 通过复制已有对象来创建新的对象 对象的创建成本较大且同一类的不同对象之间差别不大
结构型 代理 不改变原始类和不使用继承的情况下,通过引入代理类来给原始类附加功能 增加代理访问,比如监控,缓存,限流,事务,RPC
装饰者 不改变原始类的情况下,通过组合的方式动态扩展原始类的功能 动态扩展类的功能
适配器 不改变原始类的情况下,通过组合的方式使其适配新的接口 复用现有类,但与期望接口不适配
桥接 当类存在多个独立变化的维度时,通过组合的方式使得其可以独立进行扩展 存在多个维度的继承体系时
外观模式 为子系统中一组接口定义一个更高层的接口,使得子系统更加容易使用 解决接口复用性(细维度)与接口易用性(粗维度)的矛盾
组合 将对象组合成树形结构以表示部分-整体的层次结构,统一单个对组合对象的处理逻辑 满族部分与整体这种树形结构
享元 运用共享技术有效的支持大量细粒度的对象 当系统存在大量的对象,这些对象的很多字段取值范围固定
行为型 观察者 多个观察者监听同一主题对象,当主题对象状态发生变化时通知所有的观察者,使它门能够自动更新自己 解耦事件创建者与接收者
模板 定义一个操作中算法的骨架,将某些步骤实现延迟到子类中 解决复用与扩展问题
策略 定义一组算法类,将每个算法分别封装起来,使得他们可以相互替换 消除各种if-else分支判断,解耦策略的定义、创建、使用
状态 允许一个对象在其内部状态改变的时候改变其行为 分离对象的状态与行为
职责链 将一组对象连成一条链,请求沿着该链传递,知道某个对象能够处理它为止 解耦请求的发送者与接收者
迭代器 提供一种方法顺序访问一个集合对象的各个元素,但不暴露该对象的内部表示 解耦集合对象的内部表示与遍历访问
访问者 封装一些作用于某种数据结构中各元素的操作,在不改变数据结构的前提下,定义作用于这些元素的新操作 分离对象的数据结构与行为
备忘录 在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态 用于对象的备份与恢复
命令 将不同的请求封装成对应的命令对象,对命令的执行进行控制且对使用方透明 用于控制命令的执行,比如异步、延迟、排队、撤销、存储与撤销
解释器 为某个语言定义它的语法表示,并定义一个解释器来处理这个语法 用于编辑器,规则引擎,正则表达式等特定场景
中介者 定义一个单独的中介对象,来封装一组对象之间的交互,避免对象之间的直接交互 使各个对象不需要显示的相互引用,从而使其耦合松散

文章作者: Cody_
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cody_ !
评论
 上一篇
JVM和JMM JVM和JMM
JVM内存分析工作中,我们时常遇到OutOfMemoryError 异常,要想知道是怎么出现的内存溢出,要先从一张图说起: ​ 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前
2021-05-27
下一篇 
Go变量逃逸分析 Go变量逃逸分析
什么是逃逸分析逃逸分析是一种确定指针动态范围的方法——分析在程序的哪些地方可以访问到指针。也就是说通过编译器分析代码的特征和生命周期,决定应该使用堆还是使用栈来进行内存分配。 常见的两种逃逸情景: 函数中局部对象指针被返回(不确定被谁访问
2021-02-06
  目录