创建型:在创建对象的同时隐藏创建逻辑
工厂目的:生成跨平台对话框
结构:工厂类 [ ( 实体接口 ) 获取对象 ],实体接口 ( 抽象方法 ),实体类( 具体
创建型:在创建对象的同时隐藏创建逻辑
工厂
- 目的:生成跨平台对话框
- 结构:工厂类 [ ( 实体接口 ) 获取对象 ],实体接口 ( 抽象方法 ),实体类( 具体方法 )
- 中间层:将创建过程抽象为工厂类
- 接口化:将对话框动作抽象为接口
- 对象化:将具体平台对话框抽象为对象
构建器
- 目的:生成肯德基套餐
- 结构:构建器类[ ( 套餐 ) 创建套餐 ],套餐类( 单品<> ) [ 增加单品( 单品 ) ],单品接口,单品类
- 中间层:将构建步骤抽象为中间类,包含接口变量
- 接口化:将构建动作抽象为接口
- 对象化:将具体构建过程抽象为对象
原型
- 目的:生成重复对象
- 结构:缓存类( 实体<>) [ ( 实体接口 ) 获取实体 ],实体接口,实体类
- 中间层:将构建步骤抽象为中间类,包含接口变量
- 接口化:将克隆动作抽象为接口
- 对象化:将具体构建过程抽象为对象
结构型:关注类和对象的组合
桥接
- 目的:画出不同颜色的圆
- 结构:画笔接口[ 绘制 ],具体颜色画笔类 [ 绘制 ],抽象形状类( 画笔 )[ 绘制],具体形状类[ 绘制 ]
- 中间层:将控制步骤抽象为中间类,包含接口变量
- 接口化:将画的动作抽象为接口,连接使用者和具体颜色类
- 对象化:将不同颜色的圆抽象为对象
适配器
- 目的:方钉适配圆孔
- 结构:圆洞类 [ 适配 ( 圆钉 ) ],圆钉类,适配器类( 方钉 ) ,方钉类
- 中间层:将方钉适配器抽象为中间类,继承圆钉类(或实现相同接口),同时包含方钉类变量(动作一样,即可看作一类)
组合
- 目的:树形菜单,文件夹管理
- 结构:文件夹类( 文件夹<> )
- 接口化:将所有对象的动作抽象为接口
- 递归结构:一个类中包含自身对象的容器
装饰
- 目的:为画增加画框
- 结构:画接口[ 展示 ],具体画类[ 展示 ],画框抽象类( 画 )[ 展示 ],具体画框类( 画 )[ 展示 + 修饰]
- 接口化:原对象和抽象装饰类实现相同的接口,在具体装饰类中添加功能
外观
- 目的:通过接线员与仓库、支付、供货商等所有环节沟通
- 结构:接线员类( 具体部门 )[ 具体答复 ],部门接口[ 答复 ],具体部门类[ 具体答复 ]
- 中间层:在客户端和具体部门间增加接线员,通过接线员调用具体部门
享元
- 目的:复用对象中相同的部分,以节省内存
- 结构:形状接口,具体形状类,形状工厂( < 内部状态 , 形状 > )[ ( 形状 ) 创建形状( 内部状态 ) ]
- 分拆:将对象状态分为内部(稳定)和外部(变化)
- 中间层:用工厂类根据对象状态控制对象的创建
代理
- 目的:为对象提供代理以控制该对象的访问,以减少加载时的内存占用
- 结构:图形接口[ 展示 ],实际图形类[ 展示 ],代理图形类( 实际图形 )[ 展示 ]
- 接口化:代理类和实际类都实现相同的接口
- 中间层:代理类中包含实际类对象,从而可以调用实际类的方法
行为型:关注对象间的通信
责任链
- 目的:逐级传递指令,并在中途加以控制
- 结构:抽象日志类( 下级日志 ) [ 设置下级、记录、获取记录 ],具体日志类 [ 设置下级、记录、获取记录 ]
- 抽象化:客户端与抽象命令交互,具体命令扩展抽象命令,并在自己的类中添加控制
命令
- 目的:仓库和市场通过中间商完成交易,而不需直接交互
- 结构:订单接口 [ 动作 ],具体订单类( 仓库 ) [ 动作 ],仓库类 [ 买入,卖出 ],中间商类( 订单<> ) [ 接单,派送 ]
- 中间层:中间商作为中间层,完成接单和派送
- 接口化:具体订单(买单、卖单)实现订单接口
迭代器
- 目的:遍历集合元素,而不需要知道集合的底层表示
- 结构:容器接口[ ( 迭代器 ) 获取 ],容器类[ ( 迭代器 ) 获取 ],迭代器接口[ 是否到头,前进 ],迭代器类
- 接口化:将集合和迭代器抽象为接口,由具体的集合和对应迭代器实现
- 内部类:容器包含迭代器
中介者
- 目的:用户将留言发到聊天室,聊天室显示所有人的留言
- 结构:用户类 [ 发送消息 ],聊天室类 [ 显示消息 ( 用户 ) ]
- 类通信:用户作为聊天室发送消息方法的参数,用户类中直接调用聊天室的方法(静态方法,不需实例化即可访问)
备忘录
- 目的:将系统恢复到用户操作前的状态
- 结构:备忘录类(状态、时间),记录者类(备忘录容器、原发器)[备份、撤销],原发器类[记录、恢复]
- 中间层:记录者作为客户端和原发器的中间层
观察者
- 目的:对象间的一对多关系,一个对象发生改变时,所有依赖它的对象都得到通知并被自动更新
- 结构:一个主体(观察者列表)[获取状态,订阅,更新状态,通知],多个观察者/订阅者(主体)[更新]
- 接口化:具体观察者实现抽象观察者类
状态
- 目的:对象行为随状态改变而改变
- 结构:上下文类 ( 状态 ) [ 获取状态 , 设置状态 ],状态接口 [ 行为 ( 上下文 ) ] ,具体状态类 [ 行为 ( 上下文 ) ]
- 对象化:把状态抽象为具体类,而不是用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