设计模式(14)-备忘录模式


备忘录模式

简介

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

备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性
只是众多属性中的一小部分时, Originator 可以根据保存的 Memento 信息还原到前一状态。

如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储
可撤销操作的状态。

当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时储存起来的备忘录将状态复原

代码示例

<?php
/**
 * 负责创建一个备忘录 Memento 用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态
 *
 * Class Originator
 */
class Originator
{
    private $state;

    /**
     * @return mixed
     */
    public function getState()
    {
        return $this->state;
    }

    /**
     * @param mixed $state
     */
    public function setState($state)
    {
        $this->state = $state;
    }

    public function createMemento()
    {
        return (new Memento($this->state));
    }

    public function setMemento(Memento $memento)
    {
        $this->state = $memento->getState();
    }

    public function show()
    {
        echo 'State:' . $this->state . PHP_EOL;
    }
}

/**
 * 负责存储 Originator 对象的内部状态,并可以防止 Originator 以外的其他对象访问备忘录 Memento
 *
 * Class Memento
 */
class Memento
{
    private $state;

    /**
     * Memento constructor.
     * @param $state
     */
    public function __construct($state)
    {
        $this->state = $state;
    }

    /**
     * @return mixed
     */
    public function getState()
    {
        return $this->state;
    }

}

/**
 * 负责保存备忘录 Memento
 *
 * Class Caretaker
 */
class Caretaker
{
    private $memento;

    /**
     * @return mixed
     */
    public function getMemento()
    {
        return $this->memento;
    }

    /**
     * @param mixed $memento
     */
    public function setMemento($memento)
    {
        $this->memento = $memento;
    }

}

// 初始状态
$o = new Originator();
$o->setState('on');
$o->show();

// 保存备忘录
$c = new Caretaker();
$c->setMemento($o->createMemento());

// 结束状态
$o->setState('off');
$o->show();

// 还原状态
$o->setMemento($c->getMemento());
$o->show();

文章作者: 江湖义气
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 江湖义气 !
  目录