您的位置:首页 > 其它

设计模式之备忘录模式

2016-05-06 22:06 274 查看
备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

我们在这种模式中一般有三个角色:

1、Originator发起人角色

记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。

2、Memento备忘录角色

负责存储Originator发起人对象内部的状态,在需要的时候提供发起人需要的内部状态。

3、Caretaker备忘录管理员角色

对备忘录进行管理、保存和提供备忘录。

类图如下:



实现代码如下:

Originator类:

package com.designpatterns.memento;

/**
* @author WSYW126
* @version 2016年5月6日下午9:23:52
*/
public class Originator {
private String state = "";

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void restoreMemento(Memento memento) {
this.setState(memento.getState());
}

public Memento createMemento() {
return new Memento(this.state);
}
}


Memento类:

package com.designpatterns.memento;

/**
* @author WSYW126
* @version 2016年5月6日下午9:25:11
*/
public class Memento {
private String state = "";

public Memento(String state) {
this.setState(state);
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

}


Caretaker类:

package com.designpatterns.memento;

/**
* @author WSYW126
* @version 2016年5月6日下午9:27:49
*/
public class Caretaker {
private Memento memento;

public Memento getMemento() {
return memento;
}

public void setMemento(Memento memento) {
this.memento = memento;
}

}


测试类:

package com.designpatterns.memento;
/**
* @author WSYW126
* @version 2016年5月6日下午9:28:22
*/
public class Client {

public static void main(String[] args) {
Originator originator =new Originator();
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.restoreMemento(caretaker.getMemento());
}
}


上面就是备忘录模式。

不过由于java语言的特性,我们可以利用clone方法实现我们的备忘录模式

类图如下:



实现类如下:

Originator类:

package com.designpatterns.memento.clone;

/**
* @author WSYW126
* @version 2016年5月6日下午9:23:52
*/
public class Originator implements Cloneable {
private String state = "";

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void restoreMemento(Originator memento) {
this.setState(memento.getState());
}

public Originator createMemento() {
return (Originator) this.clone();
}

@Override
public Originator clone(){
try {
return (Originator) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}


Caretaker类:

package com.designpatterns.memento.clone;

/**
* @author WSYW126
* @version 2016年5月6日下午9:27:49
*/
public class Caretaker {
private Originator memento;

public Originator getMemento() {
return memento;
}

public void setMemento(Originator memento) {
this.memento = memento;
}

}


测试类:

package com.designpatterns.memento.clone;

/**
* @author WSYW126
* @version 2016年5月6日下午9:28:22
*/
public class Client {

public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.restoreMemento(caretaker.getMemento());
}
}


当然我们也可以不需要Caretaker类,我们可以实现自我的保存和恢复。我们将Originator类改为:

package com.designpatterns.memento.clonewithnocaretaker;

/**
* @author WSYW126
* @version 2016年5月6日下午9:23:52
*/
public class Originator implements Cloneable {
private String state = "";

private Originator memento=null;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void restoreMemento() {
this.setState(this.memento.getState());
}

public void createMemento() {
this.memento=this.clone();
}

@Override
public Originator clone() {
try {
return (Originator) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}


测试类变为;

package com.designpatterns.memento.clonewithnocaretaker;

/**
* @author WSYW126
* @version 2016年5月6日下午9:28:22
*/
public class Client {

public static void main(String[] args) {
Originator originator = new Originator();
originator.createMemento();
originator.restoreMemento();
}
}
这样的实现精简了很多,而且高层模块的依赖也减少了。

但是如果使用clone方法,会涉及到深拷贝和浅拷贝。大家需要留意这个问题。

参考资料
设计模式之禅

备注

转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51334700
by WSYW126
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息