详解备忘录模式及其在Java设计模式编程中的实现

网友投稿 187 2023-07-18


详解备忘录模式及其在Java设计模式编程中的实现

1. 定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2. 使用的原因

想要恢复对象某时的原有状态。

3. 适用的情况举例

有很多备忘录模式的应用,只是我们已经见过,却没细想这是备忘录模式的使用罢了,略略举几例:

eg1. 备忘录在jsp+javabean的使用:

在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。

eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。

eg3. 都说人生没有后悔药可买,我们都在为所做的事付出着代价,但在软世界里却有“后悔药”,我改变了某东西的某些状态之后,只要我们之前保存了该东西的某状态,我们就可以通过备忘录模式实现该东西的状态还原,其实这何尝不是一个能使时光倒流的“月光宝盒”,总“神奇”一词了得。

4. 类图结构及说明

(1)类图如下所示:

(2)类说明           

(i)Memento:备忘录角色,  主要负责的工作如下:

将发起人对象的内部状态存储起来;

可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

(ii)Originator:发起人角色,主要完成如下工作:

创建一个含有当前的内部状态的备忘录对象;

使用备忘录对象存储其内部状态。

(iii)Caretaker:负责人角色,完成工作如下:

负责保存备忘录对象;

不保存备忘录对象的内容。

5.实例

/**

* 数据对象

*/

public class DataState {

private String action;

public void setAction(String action) {

this.achttp://tion = action;

}

public String getAction() {

return action;

}

}

/**

* 一个保存另外一个对象内部状态拷贝 的对象.这样以后就可以将该对象恢复到原先保存的状态.

*/

import java.io.File;

import java.io.Serializable;

public class Memento implements Serializable {

/*private int number;

private File file = null;

public Memento(Originator o) {

this.number = o.getNumber();

this.file = o.getFile();

}

public int getNumber() {

return this.number;

}

public void setNumber(int number) {

this.number = number;

}

public File getFile() {

return this.file;

}

public void setFile(File file) {

this.file = file;

}

*/

private DataState state;

public Memento(Originator o) {

this.state = o.getState();

}

public DataState getState() {

return state;

}

public void setState(DataState state) {

this.state = state;

}

}

public class Originator {

/* private int number;

private File file = null;

public Originator() {

}

// 创建一个Memento,将自身作为参数传入

public Memento getMemento() {

return new Memento(this);

}

// 从Memento中取出保存的数据,恢复为原始状态

public void setMemento(Memento m) {

number = m.getNumber();

file = m.getFile();

}

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

public File getFile() {

return file;

}

public void setFile(File file) {

this.file = file;

}*/

private DataState state;

public Originator() {

}

public Originator(DataState state) {

this.state = state;

}

// 创建一个Memento,将自身作为参数传入

public Memento getMemento() {

return new Memento(this);

}

// 从Memento中取出保tnvYv存的数据,恢复为原始状态

public void setMemento(Memento m) {

/*

* getMemento() 创建的对象,保存在某个容器里,

* 当需要恢复时,将其传入当前方法, 再使用getState(),得出

*/

this.state = m.getState();

}

public DataState getState() {

return state;

}

public void setState(DataState state) {

this.state = state;

}

}

/*

* Originator用于 加载数据, 建立Memento对象,及通过Memento恢复原始数据

*/

public class Test {

public static void main(String[] args) {

// Originator originator = new Originator();

// originator.setNumber(8);

//

// Memento memento = originator.getMemento();

// System.out.println(memento.getNumber());

DataState state = new DataState();

state.setAction("copy a character");

Originator originator = new Originator();

System.out.println("创建原始数据");

originator.setState(state);

System.out.println("创建备忘录对象, 保存原始数据状态");

Memento memento = originator.getMemento();

System.out.println("创建了一个新数据");

originator.setState(new DataState());

System.out.println("创建新数据后:" + originator.getState().getAction());

/*

* memento 需要保存在某地,需要时取出,以恢复它内部所保存的数据

*/

System.out.println("创建新数据后,恢复原数据");

originator.setMemento(memento);

System.out.println(originator.getState().getAction());

}

}

打印:

创建原始数据

创建备忘录对象, 保存原始数据状态

创建了一个新数据

创建新数据后:null

创建新数据后,恢复原数据

copy a character


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅析Bootstrap缩略图组件与警示框组件
下一篇:全面解读Java中的枚举类型enum的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~