设计模式之备忘录模式--代码也有后悔药

设计模式之备忘录模式–代码也有后悔药

备忘录模式就是做个备份,可以实现撤销,游戏存档这样的功能。

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

为什么要使用备忘录模式

备忘录模式也是一个很少用到的模式,毕竟现在很多都有备份功能了。只有当你需要回到之前状态的时候才需要备忘录模式。

比如撤销功能,比如回退功能,比如游戏存档,说白了就是备份效果。只不过自带了备份效果。

php实现备忘录模式

既然是备忘录模式,那么应该有你要备份什么,备份的实体,也就是被备份的类。除了被备份的类,还有用来保存这个备份的备份类,也就是快照类。除了这两个类还需要一个用来保存快照的类,不然你的快照放在哪里呢?一般快照放在磁盘,我们这个就只能找个类存放了。也就是下面三个类:

  • 需要备份的东西,被备份类,数据类。
  • 拿什么来备份,快照类
  • 备份放在哪里,磁盘类

首先,实现被备份的类

/**
 * 备忘录模式
 * 备忘录的实体数据,要备份的数据类
 */
class main {
    //数据
    public $text;

    /**
     * 进行备份操作
     */
    function backup() {
        new memento($this->text);
    }   

    /**
     * 使用备份进行恢复
     * @param memento $memento 备份实例
     */
    function renew(memento $memento) {
        $this->text = $memento->getText();
    }

    /**
     * 展示数据
     */
    function show() {
        dump($this->text);
    }
}

有了要备份的东西,现在实现一个快照类用来进行备份。

/**
 * 备忘录模式
 * 备忘录的备份类,快照类
 */
class memento {
    //数据
    private $text;

    /**
     * 进行备份操作
     */
    function __construct($text) {
        $this->text = $text;
    }   

    /**
     * 获取备份数据
     */
    function getText() {
        return $this->text;
    }
}

现在都好了,但是呢,我们的备份存在哪里呢???一般的备份存在磁盘,我们同样要有个存储备份的地方啊,要实现一个备份存储类

/**
 * 备忘录模式
 * 备忘录的备份存储类,磁盘类
 */
class caretaker {
    //存储备份实例
    private $arr = [];

    /**
     * 进行备份操作
     */
    function add(memento $memento) {
        array_push($this->arr,$memento);
    }   

    /**
     * 把最新的一次备份返回
     */
    function getMemento() {
        return array_pop($this->arr);
    }
}

备忘录模式只要记住三点就行

  • 备份什么
  • 用什么备份
  • 备份的快照放在哪

代码放在了我的github上面。

原创文章 84 获赞 7 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Thepatterraining/article/details/106006465