[设计模式] 23种设计模式总结

创建型:在创建对象的同时隐藏创建逻辑 工厂目的:生成跨平台对话框 结构:工厂类 [ ( 实体接口 ) 获取对象 ],实体接口 ( 抽象方法 ),实体类( 具体

创建型:在创建对象的同时隐藏创建逻辑

工厂

  • 目的:生成跨平台对话框
  • 结构:工厂类 [ ( 实体接口 ) 获取对象 ],实体接口 ( 抽象方法 ),实体类( 具体方法 )
  • 中间层:将创建过程抽象为工厂类
  • 接口化:将对话框动作抽象为接口
  • 对象化:将具体平台对话框抽象为对象

构建器

  • 目的:生成肯德基套餐
  • 结构:构建器类[ ( 套餐 ) 创建套餐 ],套餐类( 单品<> ) [ 增加单品( 单品 ) ],单品接口,单品类
  • 中间层:将构建步骤抽象为中间类,包含接口变量
  • 接口化:将构建动作抽象为接口
  • 对象化:将具体构建过程抽象为对象

原型

  • 目的:生成重复对象
  • 结构:缓存类( 实体<>) [ ( 实体接口 ) 获取实体 ],实体接口,实体类
  • 中间层:将构建步骤抽象为中间类,包含接口变量
  • 接口化:将克隆动作抽象为接口
  • 对象化:将具体构建过程抽象为对象

结构型:关注类和对象的组合

桥接

  • 目的:画出不同颜色的圆
  • 结构:画笔接口[ 绘制 ],具体颜色画笔类 [ 绘制 ],抽象形状类( 画笔 )[ 绘制],具体形状类[ 绘制 ]
  • 中间层:将控制步骤抽象为中间类,包含接口变量
  • 接口化:将画的动作抽象为接口,连接使用者和具体颜色类
  • 对象化:将不同颜色的圆抽象为对象

适配器

  • 目的:方钉适配圆孔
  • 结构:圆洞类 [ 适配 ( 圆钉 ) ],圆钉类,适配器类( 方钉 ) ,方钉类
  • 中间层:将方钉适配器抽象为中间类,继承圆钉类(或实现相同接口),同时包含方钉类变量(动作一样,即可看作一类)

组合

  • 目的:树形菜单,文件夹管理
  • 结构:文件夹类( 文件夹<> )
  • 接口化:将所有对象的动作抽象为接口
  • 递归结构:一个类中包含自身对象的容器

装饰

  • 目的:为画增加画框
  • 结构:画接口[ 展示 ],具体画类[ 展示 ],画框抽象类( 画 )[ 展示 ],具体画框类( 画 )[ 展示 + 修饰]
  • 接口化:原对象和抽象装饰类实现相同的接口,在具体装饰类中添加功能

外观

  • 目的:通过接线员与仓库、支付、供货商等所有环节沟通
  • 结构:接线员类( 具体部门 )[ 具体答复 ],部门接口[ 答复 ],具体部门类[ 具体答复 ]
  • 中间层:在客户端和具体部门间增加接线员,通过接线员调用具体部门

享元

  • 目的:复用对象中相同的部分,以节省内存
  • 结构:形状接口,具体形状类,形状工厂( < 内部状态 , 形状 > )[ ( 形状 ) 创建形状( 内部状态 ) ]
  • 分拆:将对象状态分为内部(稳定)和外部(变化)
  • 中间层:用工厂类根据对象状态控制对象的创建

代理

  • 目的:为对象提供代理以控制该对象的访问,以减少加载时的内存占用
  • 结构:图形接口[ 展示 ],实际图形类[ 展示 ],代理图形类( 实际图形 )[ 展示 ]  
  • 接口化:代理类和实际类都实现相同的接口
  • 中间层:代理类中包含实际类对象,从而可以调用实际类的方法

行为型:关注对象间的通信

责任链

  • 目的:逐级传递指令,并在中途加以控制
  • 结构:抽象日志类( 下级日志 ) [ 设置下级、记录、获取记录 ],具体日志类 [ 设置下级、记录、获取记录 ]
  • 抽象化:客户端与抽象命令交互,具体命令扩展抽象命令,并在自己的类中添加控制

命令

  • 目的:仓库和市场通过中间商完成交易,而不需直接交互
  • 结构:订单接口 [ 动作 ],具体订单类( 仓库 ) [ 动作 ],仓库类 [ 买入,卖出 ],中间商类( 订单<> ) [ 接单,派送 ]
  • 中间层:中间商作为中间层,完成接单和派送
  • 接口化:具体订单(买单、卖单)实现订单接口

迭代器

  • 目的:遍历集合元素,而不需要知道集合的底层表示
  • 结构:容器接口[ ( 迭代器 ) 获取 ],容器类[ ( 迭代器 ) 获取 ],迭代器接口[ 是否到头,前进 ],迭代器类
  • 接口化:将集合和迭代器抽象为接口,由具体的集合和对应迭代器实现
  • 内部类:容器包含迭代器

中介者

  • 目的:用户将留言发到聊天室,聊天室显示所有人的留言
  • 结构:用户类 [ 发送消息 ],聊天室类 [ 显示消息 ( 用户 ) ]
  • 类通信:用户作为聊天室发送消息方法的参数,用户类中直接调用聊天室的方法(静态方法,不需实例化即可访问)

备忘录

  • 目的:将系统恢复到用户操作前的状态
  • 结构:备忘录类(状态、时间),记录者类(备忘录容器、原发器)[备份、撤销],原发器类[记录、恢复]
  • 中间层:记录者作为客户端和原发器的中间层

观察者

  • 目的:对象间的一对多关系,一个对象发生改变时,所有依赖它的对象都得到通知并被自动更新
  • 结构:一个主体(观察者列表)[获取状态,订阅,更新状态,通知],多个观察者/订阅者(主体)[更新]
  • 接口化:具体观察者实现抽象观察者类

状态

  • 目的:对象行为随状态改变而改变
  • 结构:上下文类 ( 状态 ) [ 获取状态 , 设置状态 ],状态接口 [ 行为 ( 上下文 ) ] ,具体状态类 [ 行为 ( 上下文 ) ]
  • 对象化:把状态抽象为具体类,而不是用if-else

策略

  • 目的:一个类的行为可在运行时更改
  • 结构:上下文类 ( 策略 )[ 执行策略 ],策略接口 [ 行为 ],具体策略类 [ 行为 ] 
  • 对象化:把策略抽象为具体类,而不是用if-else
  • 接口化:具体策略类重写策略接口的方法

模板

  • 目的:子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
  • 结构:模板类 [ 方法 ] ,具体类 [ 具体方法 ] 
  • 抽象化:将共用方法抽象到模板类中

访问者

  • 目的:将数据结构(稳定)与数据操作(变化)分离,避免新增方法对已有对象的污染
  • 结构:访问者[ 访问 ( 具体的被访问者 ) ],被访问者接口 [ 接受访问 ( 抽象的访问者 ) ] ,被访问者 [ 接受访问 ( 抽象的访问者 ) ]
  • 接口化:将访问者、被访问者共同的动作分别抽象为接口

说明

  • 静态来看,模式 = 结构
  • 动态来看,模式 = 构建 = 目的 + 手段
  • 结构是最终呈现,构建是依据实际场景,采用若干手段达到目的的过程
  • ( ) -- 属性
  • [ ] -- 方法
  • < > -- 容器
  • ( )在 [ ] 中
    • 方法名后 -- 参数
    • 方法名前 -- 返回值

参考

单一职责原则

https://www.cnblogs.com/cbf4life/archive/2009/12/11/1622166.html

李氏替换原则

https://www.cnblogs.com/cbf4life/archive/2009/12/11/1622245.html

依赖倒置原则

https://www.cnblogs.com/cbf4life/archive/2009/12/15/1624435.html

标签: 迭代 类中 单品