java-设计模式(行为型)-【备忘录模式】

http://alaric.iteye.com/blog/1931253

http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html

1.备忘录模式(Memento)

  定义:主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些。

          通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储

          A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作

  关系图:

           

 

2.举例

    2.1 Original类:原始类:

//原始类
public class Original {

	//状态信息
	private String state="";
    
	//备忘录:保存状态信息
	public Memento createMemento()
	{
		return new Memento(state);
	}
	
	public String getState() {
		return state;
	}
    //重置状态信息:从备忘录中重置
	public void resetState(Memento memento)
	{   
		System.out.print("重置-");
		setState(memento.getState());
	}
	public void setState(String state) {
		this.state = state;
		System.out.println("设置-状态:"+state);
	}
}
//备忘录:不可修改状态信息
class Memento
{
	private String state=null;
	public String getState()
	{
		return state;
	}
	public Memento(String state)
	{
		this.state=state;
	}
}

  2.2 存储类:

//保存备忘录的存储类
public class Storage {

	private Memento memento=null;
	public Storage(Memento memento)
	{
		this.memento=memento;
	}
	public Memento getMemento()
	{
		return memento;
	}
}

  2.3 测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Original ori=new Original();
        ori.setState("off");
        //保存备忘录
        Storage  sto=new Storage(ori.createMemento());
        //改变状态
        ori.setState("on");
        //重置状态
        ori.resetState(sto.getMemento());
	}
}

  2.4 运行结果:

设置-状态:off
设置-状态:on
重置-设置-状态:off

3. 黑箱操作(将备忘录以私有化内部类的形式定义,再通过一个接口给外界访问):

//原始类
public class Original {

	//状态信息
	private String state="";
    
	//备忘录:以内部类的方式保存信息,继承该接口,方便外界访问它
	private class Memento implements MementoIF
	{
		
		public Memento(Original ori)
		{
			state=ori.state;
		}

		public String getState() {
			// TODO Auto-generated method stub
			return null;
		}
	}
	public Memento createMemento()
	{
		return new Memento(this);
	}
	
	public String getState() {
		return state;
	}
    //重置状态信息:从备忘录中重置
	public void resetState(MementoIF  memento)
	{   
		System.out.print("重置-");
		Memento mem=(Memento)memento ;
		setState(mem.getState());
	}
	public void setState(String state) {
		this.state = state;
		System.out.println("设置-状态:"+state);
	}
}
//创建一个接口:方便外部对备忘录内部类的访问
interface MementoIF 
{
 
}

 测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Original ori=new Original();
        ori.setState("off");
        //保存备忘录
        MementoIF memento=ori.createMemento();
        //改变状态
        ori.setState("on");
        //重置状态
        ori.resetState(memento);
        }
}

 结果:

设置-状态:off
设置-状态:on
重置-设置-状态:off

  

 

posted @ 2015-04-20 18:28  beyondbycyx  阅读(155)  评论(0编辑  收藏  举报