《Head First设计模式》 读书笔记17 其余的模式(三) 备忘录 原型 访问者

 

《Head First设计模式》 读书笔记17 其余的模式(三) 备忘录 原型 访问者

备忘录(Memento Pattern)

  当你需要让对象返回之前的状态时(例如,你的用户请求“撤销”),就使用备忘录模式(Memento Pattern)

例子场景:游戏存档功能。

  使用备忘录模式有两个目标:

  1.储存系统关键对象的重要状态。

  2.维护关键对象的封装。

  请不要忘记单一责任原则,不要把保持状态的工作和关键对象混在一起,这样比较好。这个专门掌握状态的对象,就称为备忘录。

优点:

  将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。

  保持关键对象的数据封装。

  提供了容易实现的恢复能力。

用途:

  备忘录用于储存状态。

缺点:

  储存和恢复状态的过程可能相当耗时。

  在Java系统中,其实可以考虑使用序列化(serialization)机制储存系统的状态。

原型(Prototype Pattern)

  当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式(Prototype Pattern)

例子场景:交互式角色扮演游戏中的各种怪兽生成,并希望高级用户能够创建自己的怪兽。

  原型模式允许你通过复制现有的实例来创建新的实例(在Java中,这意味着使用clone()方法,或者反序列化)。

  这个模式的重点在于,客户的代码在不知道要实例化何种特定类的情况下,可以制造出新的实例。

    

优点:

  向客户隐藏制造新实例的复杂性。

  提供让客户能够产生未知类型对象的选项。

  在某些环境下,复制对象比创建新对象更有效。

用途:

  在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型。

缺点:

  使用原型模式的缺点:对象的复制有时相当复杂。

 

访问者(Visitor Pattern)

  当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式(Visitor Pattern)

例子场景:餐厅顾客询问食物相关的营养信息。

  访问者必须参观组合内的每个元素;这样的功能是在导游(Traverser)对象中,访问者通过导游的引导,收集组合中所有对象的状态。

  一旦状态被收集了,客户就可以让访问者对状态进行各种操作。

  当需要新的功能时,只要加强访问者即可。

  

优点:

  允许你对组合结构加入新的操作,而无需改变结构本身。

  想要加入新的操作,相对容易。

  访问者所进行的操作,其代码是集中在一起的。

缺点:

  当采用访问者模式的时候,就会打破组合类的封装。

  因为游走的功能牵涉其中,所以对组合结构的改变就更加困难。

原文地址:https://www.cnblogs.com/mengdd/p/3073741.html