美文网首页
设计模式(十二):备忘录模式

设计模式(十二):备忘录模式

作者: 骑着母猪砍大象 | 来源:发表于2018-12-11 20:13 被阅读1次

    转载请注明作者和出处https://www.jianshu.com/p/5ab0d57fab71

    运行平台: Windows

    php版本: php7.0

    作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员


    备忘录模式 (Memento Pattern):

        在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。又叫做快照模式(Snapshot Pattern)或Token模式。就好似我们每次玩游戏都会存档,类似于这样的一种形式。

    角色

    • 发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人能够依据须要决定备忘录存储自己的哪些内部状态。
    • 备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以外的其它对象訪问备忘录。备忘录有两个接口:管理者仅仅能看到备忘录的窄接口,他仅仅能将备忘录传递给其它对象。发起人却可看到备忘录的宽接口。同意它訪问返回到先前状态所须要的全部数据。
    • 管理者(GameRoleStateManager):负责存取备忘录,不能对的内容进行訪问或者操作。
    //发起人,所需备份者
    class Originator
    {
        //状态
        private $state;
    
        //设置状态
        public function setState($state){
            $this->state = $state;
        }
    
        //获取状态
        public function getState(){
            echo $this->state.PHP_EOL;
        }
    
        //存档
        public function createMemento(){
            return new Memento($this->state);
        }
    
        //恢复存档
        public function restoreMemento(Memento $memento){
            $this->state =  $memento->getState();
        }
    }
    
    //备忘录角色
    class Memento
    {
        private $state;
        public function __construct($state)
        {
            $this->state = $state;
        }
    
        public function getState(){
            return $this->state;
        }
    }
    
    //备忘录管理者
    class Caretaker
    {
        private $memento;
    
        //存档备忘录
        public function setMemento(Memento $memento){
            $this->memento = $memento;
        }
    
        //取出备忘录
        public function getMemento(){
            return $this->memento;
        }
    }
    
    $originator = new Originator();
    $originator->setState('满血');
    $originator->getState();
    $memento = new Caretaker();
    $memento->setMemento($originator->createMemento());//保存状态
    $originator->setState('濒血');
    $originator->getState();
    
    $originator->restoreMemento($memento->getMemento());//恢复存档
    $originator->getState();
    

    输出结果:

    满血
    濒血
    满血

    相关文章

      网友评论

          本文标题:设计模式(十二):备忘录模式

          本文链接:https://www.haomeiwen.com/subject/ednehqtx.html