原文出处:
http://www.riaidea.com/article.asp?id=23
什么是备忘录(Memento)模式?
在不破坏封装性的前提下,保存一个对象当前的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。这就是Memento模式需要解决的问题。
Memento模式并没有一个非常准确的API,但是它大致涉及到3个角色:originator(发起者),memento(备忘录),caretaker(管理者)。originator可以是任何你要保存状态的对象,它必需定义设置和获取memento的方法,用来保存和恢复状态。memento跟originator是紧密相关的,因为它要保存originator的状态,就必须知道需要保存的状态的类型及数量。caretaker提供保存及恢复memento的方法。
Memento模式是如何实现的?
经常使用计算机的人恐怕对系统备份(Memento)不会陌生,当你的Windows系统运行正常时,对它进行备份,当系统运行有问题时,就可以调用备份快速的将系统恢复,这样就可以大量节省重新装系统的时间。下面我们来看看用Memento模式是如何实现这个过程的。
1、定义操作系统WindowsSystem类,即Memento模式中的originator:
复制内容到剪贴板
代码:
package com.riaidea.dp.memento{
public class WindowsSystem{
private var _state:String;
public function WindowsSystem(){
}
//创建备份,保存当前状态
public function createMemento():Memento{
return new Memento(this._state);
}
//从备份中恢复状态
public function restoreMemento(memento:Memento):void{
this._state=memento.getState();
}
//获取状态
public function getState():String{
return this._state;
}
//设置状态
public function setState(state:String):void{
this._state=state;
trace("当前系统状态为:"+this._state);
}
}
}2、定义备份Memento类,即Memento模式中的memento:
复制内容到剪贴板
代码:
package com.riaidea.dp.memento{
public class Memento{
private var _state:String;
//创建备份
public function Memento(state:String){
this._state=state;
}
//获得状态
public function getState():String{
return this._state;
}
//设置状态
public function setState(state:String):void{
this._state=state;
}
}
}3、定义用户(User)类,即Memento模式中的caretaker:
复制内容到剪贴板
代码:
package com.riaidea.dp.memento{
public class User{
private var memento:Memento;
public function User(){
}
//恢复系统
public function retrieveMemento():Memento{
return this.memento;
}
//保存系统
public function saveMemento(memento:Memento):void{
this.memento=memento;
}
}
}4、最后我们来看看测试类Test:
复制内容到剪贴板
代码:
package com.riaidea.dp.memento{
import flash.display.Sprite;
public class Test extends Sprite{
public function Test(){
var sys:WindowsSystem=new WindowsSystem();
var user:User=new User();
sys.setState("正常");
user.saveMemento(sys.createMemento());
sys.setState("异常");
sys.restoreMemento(user.retrieveMemento());
trace("当前系统状态为:"+sys.getState());
}
}
}输出结果为:
当前系统状态为:正常
当前系统状态为:异常
当前系统状态为:正常
总结:
此例非常简单,保存的状态是一个字符串属性_state。在实际应用中,我们保存的状态属性可能不止一个。另外,这里的User只保存最后一个memento,在有些情况下我们可能需要保存一系列memento,即保存多个备份,然后根据不同的情况选择不同的备份进行恢复。因此需要修改caretaker来进行调整。这个在游戏开发中可能会经常遇到。
[
本帖最后由 flashlizi 于 2008-1-28 17:10 编辑 ]