Memento 备忘录 行为模式,在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将对象恢复到原先保存的状态。
参与者:
Memento(备忘录)
- 备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的那些内部状态。
-防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者只能看到备忘录的窄接口。他只能将备忘录传递给其他对象。相反,原发器能看到一个宽的接口,允许她访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个原发器访问本备忘录的 内部状态。
Orginator (原发器),原发器创建一个备忘录,用以记录当前时刻的她的内部状态。使用备忘录恢复内部状态。
Caretaker (负责人),负责保存好备忘录,不能对备忘录的内容进行操作或检查。
Memento 备忘录在《ActionScript 3 设计模式》里面有讲,也有很多的例子。
首先定义一个备忘录类,用来存储 游戏网络个的状态
GamePieceMemento.as
package {
public class GamePieceMemento {
private var _count:uint;
private var _owner:Gamplayer;
public function get count():uint {
return _count;
}
public function get owner():Gamplayer {
return owner;
}
public function GamePieceMemento(count:uint,owner:Gamplayer) {
_count = count;
_owner = owner;
}
}
}
创建原发器,在Proximity游戏中,我们要存储PieceData对象的备忘录因此,我们添加getMemento() 和 setMemento()方法,将PieceData类设计为一个原发器。
PieceData.as
package {
public class PieceData extends EventDispatcher {
public function PieceData() {
}
public function getMemento():GamePieceMemento {
retturn new GamePieceMemento(count,owner);
}
public function setMemento(memento:GamePieceMemento):void {
count = memento.count;
owner = memento.owner;
dispatchEvent(new Event(Event.CHANGE));
}
}
}