码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之备忘录模式

时间:2016-05-07 08:53:09      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

设计模式之备忘录模式

标签:

原文地址:http://blog.csdn.net/wsyw126/article/details/51334700

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!