PHP设计模式---备忘录模式(Memento Pattern)

定义

在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样既可以将该对象回复到原先保存的状态

使用情况

我们在编程的时候,经常保存对象的中间状态,当需要的时候,可以恢复到这个状态

结构

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

核心

备忘录类以及管理备忘录的负责人类

角色

  1. 原发器:他是一个普通类,可以创建一个备忘录,并存储它当前的内部状态,也可以使用备忘录来
    恢复内部的设计,一般讲需要保存内部状态的类设计为原发器
  2. 备忘录:就是存贮原发器的一些属性或者说是内部状态备忘录可以保护器内容不被其他对象发现访问
  3. 负责人: 负责保存备忘录对象,不检查备忘录对象内容;

实例

 class  Originator{
    private $_state;就是这个状态属性需要建立备忘存储

    public function __construct(){
        $this->_state="";
    }
    //创建备忘录
    //返回的是包含当状态的备忘录对象(就是这个方法返回了客户需要的状态)
    public function createMementp(){
        return new Momento($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 "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 {

    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();
    }

}