大话设计模式读书笔记(十五) 备忘录模式

备忘录模式:

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

模式备忘录类图:

涉及角色:

Originator(发起人):负责创建一个备忘录Memento,用以当前时刻它的内部状态,并可以使用备忘录回复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部状态。
Memento(备忘录):负责存储Originator的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:
Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到
先前状态所需要的所有数据。
Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

Java 代码实现:

//发起人类
public class Originator {
	//需要保存的属性,可以有多个
	public String state;
	public Memento createMemento(){
		return new Memento(state);
	}
	public void setMemento(Memento memento){
		state = memento.getState();
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public void show(){
		System.out.println(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 Memento getMemento() {
		return memento;
	}
	public void setMemento(Memento memento) {
		this.memento = memento;
	}
}

public class Main {
	public static void main(String[] args) {
		Originator o = new Originator();
		//设置出事状态为on
		o.setState("On");
		o.show();
		//备忘录保存状态
		Caretaker c = new Caretaker();
		c.setMemento( o.createMemento());
		
		//改变备忘录状态为Off
		o.setState("Off");
		o.show();
		
		//从备忘录中获取状态
		o.setMemento(c.getMemento());
		o.show();
	}
}

很多问题看了代码自然明了,备忘录模式还是很简单的,使用非常方便。
备忘录模式的优点:
(1)将对象状态备份,便于在出现意外时进行状态回滚。
(2)对象状态的副本交由管理器(Caretaker)管理,发起人无需管理状态的备份。而在还原状态时,又由发起人自己执行状态还原方法,外界无法获取发起人的备份状态信息从而保证了备份数据的安全性。
备忘录模式的缺点:
将对象状态备份会占用较多的系统资源。

posted @ 2017-04-19 20:47  Will_Don  阅读(171)  评论(0编辑  收藏  举报