备忘录模式 -- Mementor

2017-04-12 21:42:24   最后更新: 2017-04-12 21:42:24   访问数量:220




很多情况下,对象的操作都支持取消机制,就是将内部状态回退到操作前的版本,这样,你必须在操作执行前将对象的内部状态保存在外部

但是对象通常封装了他的状态信息,使得状态不能被其他对象访问,对外暴露内部状态是违反封装原则的

备忘录模式解决了这一问题,一个备忘录对象用来存储另一个对象在某个瞬间的内部状态,对象调用备忘录对象设置检查点,当需要回滚时,调用备忘录,备忘录对象返回所需的检查点状态,而备忘录对象对其他对象不可见

 

 

 

如上图所示,备忘录模式由以下参与者构成:

  • Mementor -- 备忘录类,用来存储原发器对象的内部状态,原发器根据需要创建备忘录对象存储原发器的某些内部状态
  • Caretaker -- 负责人类,每个备忘录类都具有一个 Caretaker 成员对象,它仅仅用来记录所需要记录的状态信息,而不能对所存储的信息进行任何操作
  • Originator -- 原发器类,创建备忘录并记录当前时刻内部状态,如果需要回滚状态,则使用此前创建的备忘录对象来获取状态信息

 

 

 

备忘录模式有以下优点:

  1. 保持封装的边界,隐藏了可能很复杂的 Originator 类,从而保持了封装的边界
  2. 简化了原发器,他只负责存储管理而无需检查和处理任何状态信息

 

但是,如果原发器在生成备忘录时必须拷贝并存储大量的信息,可能会造成巨大的开销

在一些语言中,封装性可能仍然难以保证

 

命令模式

命令模式可以使用备忘录来为可撤销的操作维护状态

 

迭代器模式

备忘录模式可以让一个集合上有多个状态一起工作

由于支持迭代器的集合对象要求迭代器必须作为他的友元类,因此破坏了封装性,结合备忘录模式,可以让集合外的对象都不能访问迭代器,从而实现了良好的封装性

 






读书笔记      技术帖      龙潭书斋      面向对象      oop      设计模式      design pattern      mementor      备忘录      友元     


京ICP备15018585号