设计模式——备忘录模式(本质:保存和恢复内部状态)

一、定义:

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

 

设计模式——备忘录模式(本质:保存和恢复内部状态)

 

二、组成部分:

1、原发器角色Originator:创建备忘录,并存储其内部状态,或者利用备忘录恢复状态;

2、备忘录角色Memento:保存原发器的状态,内部结构和原发器类似;

3、负责人角色Caretaker:存储备忘录对象,一个大容器。。。

 

三、基本代码:

//原发器

public class Originator {
	private String state;

	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public Memento createMemento() {
		return new Memento(state);
	}
	
	public void show() {
		System.out.println("dang qian zhuang tai is:"+state);
	}
	public void renew(Memento memento) {
		this.state=memento.getState();
		
	}
}

//备忘录


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;
	}

}

//管理者
package 通用代码;

public class Caretaker {
	private Memento memento=null;

	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}
	
}
//客户端
package 通用代码;

public class Client {

	public static void main(String[] args) {
		Originator or=new Originator();
		or.setState("a");
		or.show();
		
		Caretaker c=new Caretaker();
		c.setMemento(or.createMemento());
		
		or.setState("b");
		or.show();
		
		or.renew(c.getMemento());//直接传递 一个备忘录对象
		or.show();


	}

}

四:补充示例:象棋悔棋(只悔一步,多步管理者中开个容器保存所有状态)

代码实现:

package 象棋悔棋;

public class ChessMan {
	private String name;
	private int x,y;
	public ChessMan(String string, int i, int j) {
		this.name=string;
		this.x=i;
		this.y=j;
	}
	public ChessManMemento saveMemento() {//保存状态
		return new ChessManMemento(name,x,y);
	}
	public void recoveryMemento(ChessManMemento cmm) {  //悔棋
		this.name=cmm.getName();
		this.x=cmm.getX();
		this.y=cmm.getY();
	}
	
	
	public void show() {
		System.out.println(name+":("+x+","+y+")");
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}
package 象棋悔棋;

public class ChessManMemento {

	private String name;
	private int x,y;
	
	public ChessManMemento(String name, int x, int y) {
		this.name=name;
		this.x=x;
		this.y=y;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}

}
package 象棋悔棋;

public class ChessCaretaker {
	private ChessManMemento cmm=null;

	public ChessManMemento getCmm() {
		return cmm;
	}

	public void setCmm(ChessManMemento cmm) {
		this.cmm = cmm;
	}
	
}
package 象棋悔棋;

public class Client {

	public static void main(String[] args) {
		ChessMan c=new ChessMan("马",1,2);//初始化
		c.show();
		
		ChessCaretaker caretaker=new ChessCaretaker();
		caretaker.setCmm(c.saveMemento());//保存状态
		
		c.setX(0);//走下一步
		c.setY(0);
		c.show();
		
		c.recoveryMemento(caretaker.getCmm());//悔棋,只能悔一步
		c.show();
	}

}

The end;