设计模式(十二):备忘录模式
2018-12-11 本文已影响1人
骑着母猪砍大象
转载请注明作者和出处:https://www.jianshu.com/p/5ab0d57fab71
运行平台: Windows
php版本: php7.0
作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员
备忘录模式 (Memento Pattern):
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。又叫做快照模式(Snapshot Pattern)或Token模式。就好似我们每次玩游戏都会存档,类似于这样的一种形式。
角色
- 发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人能够依据须要决定备忘录存储自己的哪些内部状态。
- 备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以外的其它对象訪问备忘录。备忘录有两个接口:管理者仅仅能看到备忘录的窄接口,他仅仅能将备忘录传递给其它对象。发起人却可看到备忘录的宽接口。同意它訪问返回到先前状态所须要的全部数据。
- 管理者(GameRoleStateManager):负责存取备忘录,不能对的内容进行訪问或者操作。
//发起人,所需备份者
class Originator
{
//状态
private $state;
//设置状态
public function setState($state){
$this->state = $state;
}
//获取状态
public function getState(){
echo $this->state.PHP_EOL;
}
//存档
public function createMemento(){
return new Memento($this->state);
}
//恢复存档
public function restoreMemento(Memento $memento){
$this->state = $memento->getState();
}
}
//备忘录角色
class Memento
{
private $state;
public function __construct($state)
{
$this->state = $state;
}
public function getState(){
return $this->state;
}
}
//备忘录管理者
class Caretaker
{
private $memento;
//存档备忘录
public function setMemento(Memento $memento){
$this->memento = $memento;
}
//取出备忘录
public function getMemento(){
return $this->memento;
}
}
$originator = new Originator();
$originator->setState('满血');
$originator->getState();
$memento = new Caretaker();
$memento->setMemento($originator->createMemento());//保存状态
$originator->setState('濒血');
$originator->getState();
$originator->restoreMemento($memento->getMemento());//恢复存档
$originator->getState();
输出结果:
满血
濒血
满血