设计模式java——备忘录模式

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

白箱备忘录模式Demo:

/**
 * 2018年4月1日下午11:54:24
 */
package com.Designpattern;

/**
 * @author xinwenfeng
 *
 */
public class TestMemento {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Originator o = new Originator();
		o.setState("折纸到第三步成功");
		o.show();
		
		MyCaretaker c = new MyCaretaker();
		MyMemento m = o.CreateMemento();//创建备忘录
		c.setMemento(m);//交给管理者
		
		o.setState("折纸到第四部错误");
		o.show();
		
		o.SetMemento(c.getMemento());//从管理者拿到备忘录并回滚
		o.show();
		
	}

}
//备忘录
class MyMemento{
	private String state;
	
	public MyMemento(String s) {
		state = s;
	}

	public String getState() {
		return state;
	}
}
//管理者
class MyCaretaker{
	private MyMemento memento;

	public MyMemento getMemento() {
		return memento;
	}

	public void setMemento(MyMemento memento) {
		this.memento = memento;
	}
	
}
class Originator{
	private String state;//属性

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	public MyMemento CreateMemento() {
		return new MyMemento(state);//将当前属性保存,并得到备忘录
	}
	
	public void SetMemento(MyMemento m) {
		state = m.getState();//将当前属性设置成备忘录里的
	}
	public void show() {
		System.out.println("操作:"+state);
	}
}

结果:

黑箱备忘录:Memento使用一个空的标识接口,Originator里使用内部类实现Memento接口,Caretaker里使用空接口,防止了对Memento的操作;

黑箱备忘录Demo:

/**
 * 2018年10月16日上午10:56:25
 */
package testMemento;

/**
 * @author XWF
 *
 */
public class TestMemento {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Game g = new Game();
		g.setState("begin");
		g.showState();
		g.setState("step 1");
		g.showState();
		g.setState("step 2");
		g.showState();
		
		g.createMemento();
		
		g.setState("step 3333");
		g.showState();
		g.setState("error step");
		g.showState();
		
		g.callBack();
		g.showState();
	}

}
class Game{
	private String state;
	
	private class MementoInner implements Memento{
		String state;
		public MementoInner(String state) {
			this.state = state;
		}
		public void setState(String s) {
			state = s;
		}
		public String getState() {
			return state;
		}
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	public void createMemento() {
		System.out.println("create memento state:"+state);
		Caretaker.setMemento(new MementoInner(state));
	}
	public void callBack() {
		System.out.println("callback");
		this.state = ((MementoInner)Caretaker.getMemento()).getState();
	}
	public void showState() {
		System.out.println("state is:"+state);
	}
	
}
class Caretaker{
	private static Memento m;
	public static Memento getMemento() {
		return m;
	}
	public static void setMemento(Memento memento) {
		m = memento;
	}
}
interface Memento{
}

结果:

设计模式java——备忘录模式_第1张图片

你可能感兴趣的:(设计模式Demo)