目录

代码示例

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些。

通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。

<?php
/**
 * Description of MementoDemo
 * 备忘录模式
 * @author jm
 */
class MementoDemo
{
    //put your code here
    public static function main()
    {
        $o = new Originator(); //Originator初始状态,状态属性on
        $o->setState("On");
        $o->show();

        //保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节
        $s = new Storage();
        $s->setMemento($o->createMemento());

        // 改变属性
        $o->setState("Off");
        $o->show();

        // 恢复属性
        $o->setMemento($s->getMemento());
        $o->show();        
    }
}

//原始类
class Originator
{   
    // 需要保存的属性,可能有多个
    private $state;
    public function setState($state)
    {
        $this->state = $state;
    }
    public function getState()
    {
        return $this->state;
    }

    //创建备忘录,将当前需要保存的信息导入并实例化出一个memento对象。
    public function createMemento()
    {
        return new Memento($this->state);
    }

    //恢复备忘录,将memento导入并将相关数据恢复。
    public function setMemento(Memento $memento)
    {   
        $this->state = $memento->getState();
    }

    //显示数据
    public function show()
    {
        echo "状态: ".$this->state."\n";
    }
}

//备忘录类
class Memento
{
    private $state;

    //构造方法,将相关数据导入
    function __construct($state)
    {
        $this->state = $state;
    }

    //获取需要保存的数据,可以多个
    public function getState()
    {
        return $this->state;
    }
}

//管理者类
class Storage
{
    private $memento;

    public function getMemento()
    {   
        return $this->memento;
    }

    //设置备忘录
    public function setMemento(Memento $memento)
    {   
        $this->memento = $memento;
    }
}

MementoDemo::main();

输出

状态: On
状态: Off
状态: On

小结

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


本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @TsingChan