大话设计模式读书笔记(十五) 备忘录模式
备忘录模式:
备忘录模式(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)管理,发起人无需管理状态的备份。而在还原状态时,又由发起人自己执行状态还原方法,外界无法获取发起人的备份状态信息从而保证了备份数据的安全性。
备忘录模式的缺点:
将对象状态备份会占用较多的系统资源。