PHP设计模式 - 备忘录模式

备忘录模式又叫作快照模式(Snapshot)或 Token 模式,备忘录模式的用意是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态,这样就能够在合适的时候将该对象恢复到原先保存的状态。php

咱们在编程的时候,常常须要保存对象的中间状态,当须要的时候,能够恢复到这个状态。好比,咱们使用Eclipse进行编程时,假如编写失误(例如不当心误删除了几行代码),咱们但愿返回删除前的状态,即可以使用Ctrl+Z来进行返回。这时咱们即可以使用备忘录模式来实现。
UML:
这里写图片描述
备忘录模式所涉及的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。编程

这三个角色的职责分别是:this

发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责建立和恢复备忘录数据。
备忘录:负责存储发起人对象的内部状态,在须要的时候提供发起人须要的内部状态。
管理角色:对备忘录进行管理,保存和提供备忘录。rest

 

<?php

class Originator { // 发起人(Originator)角色
    private $_state;
    public function __construct() {
        $this->_state = '';
    }
    public function createMemento() { // 建立备忘录
        return new Memento($this->_state);
    }
    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 $this->_state;echo "<br>";
    }

}

class Memento { // 备忘录(Memento)角色 
    private $_state;
    public function __construct($state) {
        $this->setState($state);
    }
    public function getState() { return $this->_state; } 
    public function setState($state) { $this->_state = $state;}
}

class Caretaker { // 负责人(Caretaker)角色 
    private $_memento;
    public function getMemento() { return $this->_memento; } 
    public function setMemento(Memento $memento) { $this->_memento = $memento; }
}

// client
/* 建立目标对象 */
$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($memento);
$org->showState();

/* 改变目标对象的状态 */
$org->setState('close');
$org->showState();

/* 还原操做 */
$org->restoreMemento($caretaker->getMemento());
$org->showState();
/* 输出:
open
close
open
close
open */
?>
相关文章
相关标签/搜索