定义:
在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存。当对象出错或者无效是,可以根据该备忘录进行恢复。
结构图:
- Originator:原发类,被记录的对象,包含若干内部状态。一般定义了一个createMemento()方法用于生产一个备忘录,记录当前的状态。
- Memento:备忘录类,类的结构和原发类相似,选择性地选取原发类的属性作为自己的属性,用于存储原发类的状态。该类有严格的访问控制,除了原发类和负责人类可以访问,备忘录不能提供给其它类使用。
- Caretaker:负责人类,用于管理和存储备忘录。但是不能更改的内容进行操作和检验。
注意:
- 在设计备忘录类的时候,不累Originator类,不允许其它类调用备忘录类的构造函数,或者改变备忘录类的状态。再具体实现的时候,C++可以使用友元类来进行实现;Java可以使用内部类或者同一个包下来实现。
- 在设计负责人类的时候,如果要实现多次撤销或者redo的操作,需要使用一个队列来存储按照时间的多个备忘录。通过对队列的正向和反向遍历来完成撤销或者redo操作。
优点:
- 提供了一种状态恢复机制,使得用户可以方便地回到历史的一个特定历史步骤。
- 备忘录封装了类的当前状态,而不会被其它类改动。可以使用队列或者栈进行多次撤销操作。
缺点:
- 当原发类或者备忘录太多的时候严重浪费系统资源,每保存一个对象就要使用一定的内存空间。