Skip to main content
1.需求
- 多个角色
- 都有处理同一类事情的职责
- 能力不同
- 有的角色只能处理简单问题,有的可以处理复杂问题
- 好钢要用在刀刃上
- 能力强的角色可以处理所有问题,处理简单问题是对它的浪费
- 例子1
- 客户把问题反馈给运维,运维如果处理不了就反馈给研发,研发如果处理不了就反馈给项目经理
- 例子2
- 分级诊疗:小病上社区,大病去医院
2.解决思路
- 所有角色组成一个团队
- 都有处理问题的职责
- 按能力排次序
- 弱的排前面,强的压阵
- 相互自动连接
- 弱的处理不了,自动把职责交给比它强的
3.代码示例
4.模型图
1.需求
- 一个动作
- 由其所有者执行,转瞬即逝
- 希望(像东西一样)
- 能够储存或传输,用的时候再执行
- 例子1
- 支票可以传递、存储,直到需要的时候才真正执行取钱动作
- 例子2
- 回调函数作为另一个函数的参数被传入,并在其内部逻辑中被调用
2.解决思路
- 强化命令执行
- 定义命令类,专门负责执行命令
- 弱化动作主体
- 将实现类作为执行命令的参数
3.代码示例
4.模型图
1.需求
- 问题千变万化
- 不能一劳永逸的处理所有情况
- 基本思路是固定的
- 可通过组合变化,处理所有问题
- 例子1
- 数据库查询,不同业务的数据结构不同,永远处理不完;但就是筛选、投影等几个步骤
- 例子2
- 设备说明书,通过基本操作应对各种情况
2.解决思路
- 动静分离
- 将逻辑分离为描述和实现2部分
- 定义描述语法
- 用来表示逻辑(就像语言中的动词、名词、形容词,要方便表达)
- 定义解释器
- 用来翻译,将逻辑从表达层面转换到实现层面
3.代码示例
4.模型图
1.需求
- 遍历集合
- 把所有子元素过一遍
- 标准化
- 不想使用千奇百怪的遍历方式
2.解决思路
- 标准化遍历方式
- 定义遍历接口
- 职责分离
- 由专门的迭代器实现接口(专门负责遍历子元素)
- 描述迭代能力
- 能提供迭代器
3.代码示例
4.模型图
1.需求
- 多个角色之间
- 需要相互协助
- 对于其中任意一个角色来说
- 认识其它角色要花费大力气
- 例子1
- 消费者和商家互相需要对方的产品或钱,由天猫充当中介,让他们可以不用认识就能交换到对方的物品
- 例子2
- 求职者具备各式各样的工作能力,需要发展平台;公司拥有各式各样的岗位,需要能胜任的员工;为了帮助他们在一起合作,有了招聘网站、就业市场
2.解决思路
- 牵线搭桥
- 大家都到共同信任的中介去注册,让中介了解每个人的能力,帮助大家相互匹配
3.代码示例
4.模型图
1.需求
- 随时备份
- 某个时刻的状态,方便以后恢复
- 隐藏镜像
- 不想把隐私暴露给别人
2.解决思路
- 交给信赖的人
- 新建一个备忘录角色,专门用来备份/还原
- 守口如瓶
- 要把备份隐藏起来,只让我来取
3.代码示例
4.模型图
1.需求
- 当事件发生时
- 所有关注者即刻做出反应
- 例子1
- 红灯亮了,所有车辆、行人停在斑马线前
- 例子2
- 页面加载之前、之后,提供的hook
2.解决思路
- 本质
- 被观察者发出消息,逐一通知所有关注者,让它们采取行动
- 事件订阅
- 将关注者要采取的行动,提前告诉被观察者,事件发生后自动遍历调用
3.代码示例
4.模型图
1.需求
- 不同的状态下
- 有不同的行为
- 例子1
- 手机的开机按钮,关机状态时行为是开机,开机状态下行为是关机
2.解决思路
- 把状态分离出来
- 描述一个状态类
- 描述各种状态
- 每个状态类都要继承自抽象状态类,并完成相应状态下的行为逻辑
3.代码示例
4.模型图
1.需求
- 一个问题有多种解决办法
- 希望可以随时更换
- 例子1
- 上班,可以骑自行车,也可以开车,根据心情去选择
- 例子2
- 实现排序,可以用冒泡算法,也可以用二分法等,都实现出来,根据实际使用效果来替换
2.解决思路
- 将算法分离
- 定义成接口
- 实现各种算法
- 每种算法都要按照接口来实现
3.代码示例
4.模型图
1.需求
- 某件工作有这样的特点
- 无论是哪种解决方案,流程骨架固定不变,仅有某些步骤有些差别
- 例子1
- 铁打的营盘,流水的兵
- 例子2
- web请求的生命周期固定,框架在在请求处理前后留出2个hook,程序员可以在此处实现不同的逻辑
2.解决思路
- 模版思维
- 整体描述出来,不变的固定在那里,变的部分放个'占位符'
- 实现具体解决方案
- 就是填充'占位符',通过继承和方法覆盖即可完成
3.代码示例
4.模型图
1.需求
- 角色的职责
- 将来需要扩展,但目前还能应付
- 新职责的需求
- 外包给别人,但对外还是我做的
- 例子1
- 研发团队接了个项目,做完后客户突然要求整个ppt文案给培训,大家都不擅长,干脆外包给一个文科尖子生,对外还是我们做的
2.解决思路
- 预留职责
- 定义一个accept方法接受外包产品
- 职责交接
- 定义visitor实现新职责,角色需要时,从这里'拿'逻辑
3.代码示例
4.模型图