PHP设计模式笔记:备忘录(memento)
备忘录模式:
又叫快照模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
要点:
- 备忘录由发起者创建,并且只能由创建者读取
- 负责人只负责保管,不能查看备忘录
结构图:
角色:
- 发起人(Originator):创建,读取备忘录
- 备忘录(Memento):存储发起人(Originator)对象的内部状态
- 负责人(Caretaker):负责保存备忘录对象,不检查备忘录对象的内容
应用场景:
如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。
优点:
- 当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。
- 备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
缺点:
- 占用很大的存储空间
<?php
/**
* 备忘录模式
* @author phppan
* @package design pattern
*/
/**
* 发起人(Originator)角色
*/
class Originator {
private $_state;
public function __construct() {
$this->_state = '';
}
/**
* 创建备忘录
* @return Memento 包含当前状态的备忘录对象
*/
public function createMemento() {
return new Memento($this->_state);
}
/**
* 将发起人恢复到备忘录对象记录的状态上
* @param Memento $memento
*/
public function restoreMemento(Memento $memento) {
$this->_state = $memento->getState();
}
public function setState($state) {
$this->_state = $state;
}
public function getState() {
return $this->_state;
}
/**
* 测试用方法,显示状态
*/
public function showState() {
echo "Original Status:", $this->getState(), "<br />";
}
}
/**
* 备忘录(Memento)角色
*/
class Memento {
private $_state;
public function __construct($state) {
$this->setState($state);
}
public function getState() {
return $this->_state;
}
public function setState($state) {
$this->_state = $state;
}
}
/**
* 负责人(Caretaker)角色
*/
class Caretaker {
private $_memento;
public function getMemento() {
return $this->_memento;
}
public function setMemento(Memento $memento) {
$this->_memento = $memento;
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function main() {
/* 创建目标对象 */
$org = new Originator();
$org->setState('open');
$org->showState();
/* 创建备忘 */
$memento = $org->createMemento();
/* 通过Caretaker保存此备忘 */
$caretaker = new Caretaker();
$caretaker->setMemento($memento);
/* 改变目标对象的状态 */
$org->setState('close');
$org->showState();
/* 还原操作 */
$org->restoreMemento($caretaker->getMemento());
$org->showState();
}
}
Client::main();
?>