备忘录模式(Memento)----行为笔记

备忘录(Memento)对象:一个用来存储另外一个对象内部状态(信息)的快照的对象

用意:在不破坏 封装 的条件下,捕捉一个对象的状态(信息),并外部化存储起来,从而可以在将来合适的时候把对象还原到存储起来的状态。

 

一、涉及角色:

a) 发起人(Originator):创建一个含有当前的内部 信息(状态)的 备忘录(Memento对象。使用备忘录对象存储其内部信息(状态);

b) 备忘录(Memento):备忘录存储原 发起人(Originator对象 的内部状态。

c) 负责人(Caretaker):负责保存好备忘录,不能对备忘录的内容进行操作或检查。

 

二、备忘录模式优点

         1、有时发起人对象的内部信息(状态)必须保存在发起人对象以处的地方,但是必须要由发起人对象自己读取,使用备忘录可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当保持封装的边界。

         2、简化发起人(Originator)类。发起人(Originator)不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理它们所需要的这些状态的版本

         3、当发起人角色的状态改变时,有可能这个状态无效,这时候就可以使用暂时存储起来备忘录将状态复原

缺点:

         如果发起人的状态需要完整存储到备忘录对象中,过于消耗资源

三、故事说明      

STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

 

发起人(Originator)
public class Originator {
	private String state;
	
	public void showState(){
		System.out.println(state);
	}
	
	public Memento createMemento(){
		return new Memento(state);		
	}
	
	public void setMememto(Memento memento){
		state = memento.getState();
	}
	
	public String getState() { return state; }
	public void setState(String state) { this.state = state; }
	
}

备忘录对象
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 void setMemento(Memento memento) {
		this.memento = memento;
	}

	public Memento getMemento() {
		return memento;
	}
	
}


 

public class Client {
	public static void main(String[] args) {
		Originator originator = new Originator();
		originator.setState("状态:1");
		originator.showState();
		
		Caretaker caretaker = new Caretaker();
		caretaker.setMemento(originator.createMemento()); //创建备忘录,保存状态
		
		originator.setState("状态:2");
		originator.showState();
		
		originator.setMememto(caretaker.getMemento());
		originator.showState();
	}
}


 

四、多重检查点

         可以存储多个状态,将发起人对象的状态存储到备忘录对象里面,备忘录模式将发起人恢复到所存储的某一个检查点。

         发起人的状态存在于一个Vector对象中,每一个状态都有一个指数 index,叫做检查点指数,

注意:备忘录的构造方法中克隆了传入的stateList,然后将克隆存入备忘内部,非常重要,不然会造成客户端和备忘录对象持有对同一个Vector对象的引用,

 

//发起人对象
public class Originator {
	private Vector stateList;
	private int index;
	
	@SuppressWarnings("rawtypes")
	public Originator(){
		stateList = new Vector();
		index = 0 ;
	}
	
	/*工厂方法,创建备忘录对象*/
	public Memento createMemento(){
		return new Memento(stateList, index);
	}
	/*--将发起人恢复到备忘录对象记录的状态--*/
	public void restoreMemento(Memento memento){
		stateList = memento.getStateList();
		index = memento.getIndex();
	}
	/*--状态的赋值方法--*/
	public void setState(String state){
		this.stateList.add(state);
		index++;
	}
	
	/*--打印状态--*/
	public void printStates(){
		System.out.println("---->状态总数:" + index);
		for (int i = 0; i < stateList.size(); i++) {
			System.out.println(stateList.get(i));
		}
	}
}


 

/*备忘录对象*/
public class Memento {
	private Vector stateList;
	private int index;
	
	public Memento(Vector stateList, int index) {
		this.stateList = (Vector) stateList.clone();	//注意:clone
		this.index = index;
	}

	public Vector getStateList() {  return stateList; }
	public void setStateList(Vector stateList) { this.stateList = stateList; }
	public int getIndex() { return index; }
	public void setIndex(int index) { this.index = index; }
		
}

//负责人对象
public class Caretaker {
	private Originator originator;
	private Vector mementoList = new Vector();
	private int current;
	public Caretaker(Originator originator) {
		this.originator = originator;
	}
	
	/*--创建一个新检查点--*/
	public int createMementor(){
		Memento memento = originator.createMemento();
		mementoList.add(memento);
		return current++;
	}
	/*--将发起人恢复到某个检查点--*/
	public void restoreMemento(int index){
		Memento memento = (Memento) mementoList.get(index);
		originator.restoreMemento(memento);
	}
	/*--将某个检查点删除--*/
	public void removeMemento(int index){
		mementoList.remove(index);
	}
}

public class Client {
	public static void main(String[] args) {
		Originator originator = new Originator();
		Caretaker caretaker = new Caretaker(originator);
		
		originator.setState("状态:0");	//改变状态
		caretaker.createMementor();		//建立一个检查点
		
		originator.setState("状态:1");	//改变状态
		caretaker.createMementor();		//建立一个检查点
		
		originator.setState("状态:2");	//改变状态
		caretaker.createMementor();		//建立一个检查点
		
		originator.printStates();
		System.out.println("---下面是恢复到状态:1----");
		caretaker.restoreMemento(1);
		originator.printStates();
		
		System.out.println("---下面是恢复到状态:2----");
		caretaker.restoreMemento(2);
		originator.printStates();
	}
}


打印的信息

---->状态总数:3
状态:0
状态:1
状态:2


---下面是恢复到状态:1----
---->状态总数:2
状态:0
状态:1


---下面是恢复到状态:2----
---->状态总数:3
状态:0
状态:1
状态:2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值