美文网首页
行为型设计模式->备忘录模式

行为型设计模式->备忘录模式

作者: liu66_net | 来源:发表于2018-12-06 11:48 被阅读0次
    • 目的

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

    • 角色

      1.发起人 Origianator:负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态,Originator可以根据Memento存储自己的那些状态

      2.备忘录(Memento)负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录,备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。

      3.Caretaker(管理者)负责备忘录Memento,不能对Memento的内容进行访问和修改

    • 代码
    <?php
    //备忘录模式
    
    //编辑器
    class Edit
    {
        public $act;
    
        public $content;
    
    //保存状态
        public function saveState(Caretaker $caretaker)
        {
            $caretaker->add(new Memento($this->act,$this->content));
        }
        //恢复状态
        public function recoveryState(Memento $memento)
        {
            $this->act = $memento->act;
            $this->content = $memento->content;
        }
    
        public function modify($act,$content)
        {
            $this->act = $act;
            $this->content = $content;
        }
    
        public function show()
        {
            echo "操作:".$this->act."\r\n";
            echo "内容:".$this->content."\r\n";
        }
    
    
    
    }
    
    //存储
    class Memento
    {
        public $act;
        public $content;
    
        public function __construct($act,$content)
        {
            $this->act = $act;
            $this->content = $content;
        }
    }
    
    //管理类
    class Caretaker
    {
        public $data = array();
    
        public function add(Memento $memento)
        {
            $this->data[] = $memento;
        }
    
        //获取上一个
        public function getLast()
        {
            $len = count($this->data);
    
            if($len < 1)
            {
                return;
            }
    
            return $this->data[$len - 1];
        }
    }
    
    //动作
    
    class Client
    {
        public static function main($argv)
        {
            $edit = new Edit();
            $caretaker = new Caretaker();
    
            $edit->modify('插入abc','abc');
            $edit->saveState($caretaker);
    
            $edit->modify('插入d','abcd');
            $edit->saveState($caretaker);
    
            $edit->modify('删除c','abd');
            $edit->saveState($caretaker);
    
            $edit->modify('插入e','abde');
    
            //恢复上一个状态
            $edit->recoveryState($caretaker->getLast());
    
            $edit->show();
        }
    }
    Client::main($argv=0);
    
    

    相关文章

      网友评论

          本文标题:行为型设计模式->备忘录模式

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