备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
我们在这种模式中一般有三个角色:
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.youkuaiyun.com/wsyw126/article/details/51334700
by WSYW126