行为型之备忘录模式
来源:互联网 发布:英雄联盟视频js 编辑:程序博客网 时间:2024/06/08 08:12
1、备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为 Token
在备忘录模式结构图中包含如下几个角色:
Originator(原发器):它是一个普通类,可以创建一个备忘录,并存储它的当前内部状态,也可以使用备忘录来恢复其内部状态,一般将需要保存内部状态的类设计为原发器。Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。需要注意的是,除了原发器本身与负责人类之外,备忘录对象不能直接供其他类使用,原发器的设计在不同的编程语言中实现机制会有所不同。Caretaker(负责人):负责人又称为管理者,它负责保存备忘录,但是不能对备忘录的内容进行操作或检查。在负责人类中可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。理解备忘录模式并不难,但关键在于如何设计备忘录类和负责人类。由于在备忘录中存储的是原发器的中间状态,因此需要防止原发器以外的其他对象访问备忘录,特别是不允许其他对象来修改备忘录。
下面我们通过简单的示例代码来说明如何使用 Java 语言实现备忘录模式:
在使用备忘录模式时,首先应该存在一个原发器类 Originator,在真实业务中,原发器类是一个具体的业务类,它包含一些用于存储成员数据的属性,典型代码如下所示:
package dp.memento;public class Originator { private String state; public Originator(){} // 创建一个备忘录对象 public Memento createMemento() { return new Memento(this); } // 根据备忘录对象恢复原发器状态 public void restoreMemento(Memento m) { state = m.state; } public void setState(String state) { this.state=state; } public String getState() { return this.state; }}
对于备忘录类 Memento 而言,它通常提供了与原发器相对应的属性(可以是全部,也可以是部分)用于存储原发器的状态,典型的备忘录类设计代码如下:
package dp.memento;//备忘录类,默认可见性,包内可见class Memento { private String state; public Memento(Originator o) { state = o.getState(); } public void setState(String state) { this.state=state; } public String getState() { return this.state; }}
在设计备忘录类时需要考虑其封装性,除了 Originator 类,不允许其他类来调用备忘录类 Memento 的构造函数与相关方法,如果不考虑封装性,允许其他类调用 setState() 等方法,将导致在备忘录中保存的历史状态发生改变,通过撤销操作所恢复的状态就不再是真实的历史状态,备忘录模式也就失去了本身的意义。
在使用 Java 语言实现备忘录模式时,一般通过将 Memento 类与 Originator 类定义在同一个包(package)中来实现封装,在 Java 语言中可使用默认访问标识符来定义 Memento 类,即保证其包内可见。只有 Originator 类可以对 Memento 进行访问,而限制了其他类对 Memento 的访问。在 Memento 中保存了 Originator 的 state 值,如果 Originator 中的 state 值改变之后需撤销,可以通过调用它的 restoreMemento() 方法进行恢复。
对于负责人类 Caretaker,它用于保存备忘录对象,并提供 getMemento() 方法用于向客户端返回一个备忘录对象,原发器通过使用这个备忘录对象可以回到某个历史状态。典型的负责人类的实现代码如下:
package dp.memento;public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento=memento; }}
在 Caretaker 类中不应该直接调用 Memento 中的状态改变方法,它的作用仅仅用于存储备忘录对象。将原发器备份生成的备忘录对象存储在其中,当用户需要对原发器进行恢复时再将存储在其中的备忘录对象取出。
- 行为型之备忘录模式
- 设计模式-行为型之备忘录模式
- 行为型模式之备忘录模式实现
- 行为型模式之备忘录MEMENTO
- 行为模式之备忘录模式
- 备忘录模式(行为型)
- Java设计模式之行为型模式(备忘录模式)
- 行为型模式--备忘录模式
- 行为型模式-备忘录模式
- 设计模式笔记--行为型模式之六--Memento 备忘录
- 行为型模式之备忘录模式(Memento)
- java设计模式(行为型)之备忘录模式
- 设计模式(行为型)之备忘录模式(Memento Pattern)
- 行为型模式之五——备忘录模式
- 行为型:设计模式之备忘录模式(二十)
- 行为型模式之备忘录模式(Memento)
- 行为型模式-备忘录memento
- 备忘录模式(行为型)
- GYM 101149 E.The Best among Equals(水~)
- 割点(模板)
- Linux中的Atime,Mtime,Ctime
- Docker windows安装tensorflow
- L2-002. 链表去重
- 行为型之备忘录模式
- java String 赋值
- ubuntu下使用脚本自动禁用笔记本触摸板和键盘
- Python字符串比较忽略大小写的方法
- ionic 实现自动升级APP
- IDEA常用快捷键
- [H5]HTML5的基本结构、声明、标签、属性
- List集合
- opencv输出图像数据到txt文件