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.模型图

1.
2.