B9:备忘录模式 Memento
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态
UML:
示例代码:
class Role { private $hp; private $attack; public function __construct($hp, $attack) { $this->hp = $hp; $this->attack = $attack; } public function fight() { $this->hp = 0; echo "开始打Boos,血条到了{$this->hp}" . PHP_EOL; } // 创建一个备份 public function createMemento() { return new RoleMemento($this->hp, $this->attack); } public function restoreMemento(RoleMemento $memento) { $this->hp = $memento->getHp(); $this->attack = $memento->getAttack(); echo "又恢复了, 血条到了{$this->hp};攻击力到了{$this->attack}"; } } class RoleMemento { private $hp; private $attack; public function __construct($hp, $attack) { $this->hp = $hp; $this->attack = $attack; } public function __call($name, $args) { $name = strtolower(str_replace('get', '', $name)); if (property_exists($this, $name)) { return $this->$name; } } } class MementoAdmin { private $memento; public function setMemento(RoleMemento $roleMemento) { $this->memento = $roleMemento; } public function getMemento() { return $this->memento; } } $role = new Role(5900, 1500); $admin = new MementoAdmin(); $admin->setMemento($role->createMemento()); // 创建一个备份 $role->fight(); $role->restoreMemento($admin->getMemento());
如果只有一个备忘录,可以取消备忘录管理者.