《Head First设计模式》 读书笔记17 其余的模式(三) 备忘录 原型 访问者
备忘录(Memento Pattern)
当你需要让对象返回之前的状态时(例如,你的用户请求“撤销”),就使用备忘录模式(Memento Pattern) 。
例子场景:游戏存档功能。
使用备忘录模式有两个目标:
1.储存系统关键对象的重要状态。
2.维护关键对象的封装。
请不要忘记单一责任原则,不要把保持状态的工作和关键对象混在一起,这样比较好。这个专门掌握状态的对象,就称为备忘录。
优点:
将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。
保持关键对象的数据封装。
提供了容易实现的恢复能力。
用途:
备忘录用于储存状态。
缺点:
储存和恢复状态的过程可能相当耗时。
在Java系统中,其实可以考虑使用序列化(serialization)机制储存系统的状态。
原型(Prototype Pattern)
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式(Prototype Pattern) 。
例子场景:交互式角色扮演游戏中的各种怪兽生成,并希望高级用户能够创建自己的怪兽。
原型模式允许你通过复制现有的实例来创建新的实例(在Java中,这意味着使用clone()方法,或者反序列化)。
这个模式的重点在于,客户的代码在不知道要实例化何种特定类的情况下,可以制造出新的实例。
优点:
向客户隐藏制造新实例的复杂性。
提供让客户能够产生未知类型对象的选项。
在某些环境下,复制对象比创建新对象更有效。
用途:
在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型。
缺点:
使用原型模式的缺点:对象的复制有时相当复杂。
访问者(Visitor Pattern)
当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式(Visitor Pattern) 。
例子场景:餐厅顾客询问食物相关的营养信息。
访问者必须参观组合内的每个元素;这样的功能是在导游(Traverser)对象中,访问者通过导游的引导,收集组合中所有对象的状态。
一旦状态被收集了,客户就可以让访问者对状态进行各种操作。
当需要新的功能时,只要加强访问者即可。
优点:
允许你对组合结构加入新的操作,而无需改变结构本身。
想要加入新的操作,相对容易。
访问者所进行的操作,其代码是集中在一起的。
缺点:
当采用访问者模式的时候,就会打破组合类的封装。
因为游走的功能牵涉其中,所以对组合结构的改变就更加困难。