设计模式学习笔记(十七)—Memento备忘录模式
一、 模式定义:
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存前的状态。
二、 模式解说
在程序运行过程中,某些对象的状态处在转换过程中,可能由于某种原因需要保存此时对象的状态,以便程序运行到某个特定阶段,需要恢复到对象之前处于某个点时的状态。如果使用一些公有接口让其它对象来得到对象的状态,便会暴露对象的实现细节。
三、 结构图
1) 备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2) 备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3) 备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查。
四、一个例子
这个例子是我从网上找到的,我觉得它比较形象,就拿过来直接用了。下面是这个例子的代码:
class WindowsSystem{ private String state; public Memento createMemento(){ //创建系统备份 return new Memento(state); } public void restoreMemento(Memento m){ //恢复系统 this.state=m.getState(); } public String getState() { return state; } public void setState(String state) { this.state = state; System.out.println("当前系统处于"+this.state); } }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; }}class User{ private Memento memento; public Memento retrieveMemento() { //恢复系统 return this.memento; } public void saveMemento(Memento memento){ //保存系统 this.memento=memento; }}public class Test{ public static void main(String[] args) { WindowsSystem Winxp = new WindowsSystem(); //Winxp系统 User user = new User(); //某一用户 Winxp.setState("好的状态"); //Winxp处于好的运行状态 user.saveMemento(Winxp.createMemento()); //用户对系统进行备份,Winxp系统要产生备份文件 Winxp.setState("坏的状态"); //Winxp处于不好的运行状态 Winxp.restoreMemento(user.retrieveMemento()); //用户发恢复命令,系统进行恢复 System.out.println("当前系统处于"+Winxp.getState()); }}