中介者
中介者模式:使用中介者来集中相关对象之间复杂的沟通方式和控制方式。
Bob有一个自动屋,当他的闹钟响了只有,闹钟会告诉咖啡壶开始煮咖啡。后来客户不断的提出许多新需求:周末不要提供咖啡、下班后需要扫地机器人扫地等。这个时候咖啡壶需要接受闹钟并检查日期,而日历需要接受闹钟的询问并告诉闹钟是否周末,扫地机器人需要接受闹钟并检查是否下班时间等等一系列操作。
想要持续地追踪每个对象的每个规则,以及众多对象之间彼此错综复杂的关系对于设计来说不满足单一职责,同时可能会相互引用造成系统复杂。这个时候就可以使用中介者模式,在系统中引入一个中介者。
- 每个对象都会在自己的状态改变时,告诉中介者。
- 每个对象都会对中介者发出的请求作出响应。
设计类图:
1) Mediator 抽象中介者
用于定义统一的接口, 用于各设备对象之间的交互
2) Concrete Mediator 具体中介者
具体中介者持有各设备对象的引用, 负责协调各设备对象的行为以完成协作, 因此具体中介者必须依赖具体设备对象(不符合依赖倒置原则)
3) Equipment 设备抽象类
每个设备都知道中介者对象(持有接口引用), 与其他设备通信的时候,都通过中介者协作完成
每个设备实现接口用于中介者通知
优点:
1、通过将对象彼此解耦,可以增加对象的复用性。
2、通过将控制逻辑集中,可以简化系统维护。
3、可以让对象之间所传递的消息变得简单而且大幅减少。
用途和缺点
1、中介者常常被用来协调相关的GUI组件。
2、中介者的缺点是,如果设计不当,中介者对象本身会变得过于复杂。
备忘录
备忘录模式:当你需要让对象返回之前的状态时,就使用备忘录模式(例如,“撤销”操作)
比如我们经常玩的单机游戏,当用户进入到下一关时我们在游戏中死亡,一般复活后就是从这关游戏的最开始复活。而对于我们进入到下一关时就是一个备忘录模式,让我们停留在上一次过关的关卡上。
备忘录模式有两个目标:
- 储存系统关键对象的重要状态。
- 维护关键对象的封装。
不要忘记了单一职责,不要把保持状态的工作和关键对象混为一谈。这个专门掌握状态的对象,就称为备忘录。
设计类图:
优点:
1、将被存储的状态放在外面,不要和关键对象混在一起,可以帮助维护内聚。
2、保持关键对象的数据封装。
3、提供能容易实现的恢复能力。
用途和缺点:
1、备忘录用于存储状态。
2、使用备忘录的缺点:存储和恢复状态的过程可能相当耗时。
3、在系统设计时可以考虑使用序列化(serialization)机制存储系统的对象。