18 行为模式 - 备忘录(Memento)模式

需要跟进多重检查点。

1.用意

又叫快照模式或Token模式。

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。

2.类图

白箱实现

黑箱实现



 

3.代码

白箱实现

/*
 * 备忘录角色
 */
public class Memento {
	private String state;
	public Memento(String state) {
		this.state = state;
	}
	public String getState(){
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
}


/*
 * 负责人角色
 */
public class Caretaker {
	private Memento memento;

	public Memento retrieveMemento() {
		return memento;
	}

	public void saveMemento(Memento memento) {
		this.memento = memento;
	}
}


/*
 * 发起人角色
 */
public class Originator {
	private String state;

	public Memento createMemento() {
		return new Memento(state);
	}

	/*
	 * 将发起人恢复到备忘录对象所记载的状态
	 */
	public void restoreMemento(Memento memento) {
		this.state = memento.getState();
		S.s("Current state = " + this.state);
	}

	public String getState() {
		return this.state;
	}

	public void setState(String state) {
		this.state = state;
		S.s("Current state = " + this.state);
	}
}


/*
 * 测试类
 */
public class Test {

	private static Originator o = new Originator();
	private static Caretaker c = new Caretaker();
	
	public static void main(String[] args) {		
		o.setState("On");
		c.saveMemento(o.createMemento());
		o.setState("Off");
		o.restoreMemento(c.retrieveMemento());
	}
}
  黑箱实现
/*
 * 标识接口
 */
public interface MementoIF {
}


/*
 * 负责人角色
 */
public class Caretaker {
	private MementoIF memento;

	public MementoIF retrieveMemento() {
		return this.memento;
	}

	public void saveMemento(MementoIF memento) {
		this.memento = memento;
	}
}


/*
 * 发起人角色
 */
public class Originator {
	private String state;

	public Originator() {
	}
	
	public MementoIF createMemento() {
		return new Memento(this.state);
	}

	/*
	 * 将发起人恢复到备忘录对象所记载的状态
	 */
	public void restoreMemento(MementoIF memento) {
		Memento aMemento = (Memento)memento;
		this.setState(aMemento.getState());
		S.s("Current state = " + this.state);
	}

	public String getState() {
		return this.state;
	}

	public void setState(String state) {
		this.state = state;
		S.s("Current state = " + this.state);
	}
	
	/*
	 * 备忘录角色
	 */
	protected class Memento implements MementoIF{
		private String savedState;
		public Memento(String someState) {
			this.savedState = someState;
		}
		public String getState(){
			return savedState;
		}
		public void setState(String someState) {
			this.savedState = someState;
		}
	}
	
}


/*
 * 测试类
 */
public class Test {

	private static Originator o = new Originator();
	private static Caretaker c = new Caretaker();
	
	public static void main(String[] args) {		
		o.setState("On");
		c.saveMemento(o.createMemento());
		o.setState("Off");
		o.restoreMemento(c.retrieveMemento());
	}
}
 

z

需要跟进多重检查点。

1.用意

又叫快照模式或Token模式。

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。

2.类图

白箱实现

黑箱实现



 

3.代码

白箱实现

/*
 * 备忘录角色
 */
public class Memento {
	private String state;
	public Memento(String state) {
		this.state = state;
	}
	public String getState(){
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
}


/*
 * 负责人角色
 */
public class Caretaker {
	private Memento memento;

	public Memento retrieveMemento() {
		return memento;
	}

	public void saveMemento(Memento memento) {
		this.memento = memento;
	}
}


/*
 * 发起人角色
 */
public class Originator {
	private String state;

	public Memento createMemento() {
		return new Memento(state);
	}

	/*
	 * 将发起人恢复到备忘录对象所记载的状态
	 */
	public void restoreMemento(Memento memento) {
		this.state = memento.getState();
		S.s("Current state = " + this.state);
	}

	public String getState() {
		return this.state;
	}

	public void setState(String state) {
		this.state = state;
		S.s("Current state = " + this.state);
	}
}


/*
 * 测试类
 */
public class Test {

	private static Originator o = new Originator();
	private static Caretaker c = new Caretaker();
	
	public static void main(String[] args) {		
		o.setState("On");
		c.saveMemento(o.createMemento());
		o.setState("Off");
		o.restoreMemento(c.retrieveMemento());
	}
}
  黑箱实现
/*
 * 标识接口
 */
public interface MementoIF {
}


/*
 * 负责人角色
 */
public class Caretaker {
	private MementoIF memento;

	public MementoIF retrieveMemento() {
		return this.memento;
	}

	public void saveMemento(MementoIF memento) {
		this.memento = memento;
	}
}


/*
 * 发起人角色
 */
public class Originator {
	private String state;

	public Originator() {
	}
	
	public MementoIF createMemento() {
		return new Memento(this.state);
	}

	/*
	 * 将发起人恢复到备忘录对象所记载的状态
	 */
	public void restoreMemento(MementoIF memento) {
		Memento aMemento = (Memento)memento;
		this.setState(aMemento.getState());
		S.s("Current state = " + this.state);
	}

	public String getState() {
		return this.state;
	}

	public void setState(String state) {
		this.state = state;
		S.s("Current state = " + this.state);
	}
	
	/*
	 * 备忘录角色
	 */
	protected class Memento implements MementoIF{
		private String savedState;
		public Memento(String someState) {
			this.savedState = someState;
		}
		public String getState(){
			return savedState;
		}
		public void setState(String someState) {
			this.savedState = someState;
		}
	}
	
}


/*
 * 测试类
 */
public class Test {

	private static Originator o = new Originator();
	private static Caretaker c = new Caretaker();
	
	public static void main(String[] args) {		
		o.setState("On");
		c.saveMemento(o.createMemento());
		o.setState("Off");
		o.restoreMemento(c.retrieveMemento());
	}
}
 

z

  黑箱实现
/*
 * 标识接口
 */
public interface MementoIF {
}


/*
 * 负责人角色
 */
public class Caretaker {
	private MementoIF memento;

	public MementoIF retrieveMemento() {
		return this.memento;
	}

	public void saveMemento(MementoIF memento) {
		this.memento = memento;
	}
}


/*
 * 发起人角色
 */
public class Originator {
	private String state;

	public Originator() {
	}
	
	public MementoIF createMemento() {
		return new Memento(this.state);
	}

	/*
	 * 将发起人恢复到备忘录对象所记载的状态
	 */
	public void restoreMemento(MementoIF memento) {
		Memento aMemento = (Memento)memento;
		this.setState(aMemento.getState());
		S.s("Current state = " + this.state);
	}

	public String getState() {
		return this.state;
	}

	public void setState(String state) {
		this.state = state;
		S.s("Current state = " + this.state);
	}
	
	/*
	 * 备忘录角色
	 */
	protected class Memento implements MementoIF{
		private String savedState;
		public Memento(String someState) {
			this.savedState = someState;
		}
		public String getState(){
			return savedState;
		}
		public void setState(String someState) {
			this.savedState = someState;
		}
	}
	
}


/*
 * 测试类
 */
public class Test {

	private static Originator o = new Originator();
	private static Caretaker c = new Caretaker();
	
	public static void main(String[] args) {		
		o.setState("On");
		c.saveMemento(o.createMemento());
		o.setState("Off");
		o.restoreMemento(c.retrieveMemento());
	}
}
 

猜你喜欢

转载自samsongbest.iteye.com/blog/1632368