设计模式之备忘录模式

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值