zoukankan      html  css  js  c++  java
  • php 23种设计模式

    备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

    介绍

    意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

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

    何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

    如何解决:通过一个备忘录类专门存储对象状态。

    关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

    应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。

    优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

    缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

    使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

    注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。

    class Originator { // 发起人(Originator)角色
        private $_state;
        public function __construct() {
            $this->_state = '';
        }
        public function createMemento() { // 创建备忘录
            return new Memento($this->_state);
        }
        public function restoreMemento(Memento $memento) { // 将发起人恢复到备忘录对象记录的状态上
            $this->_state = $memento->getState();
        }
        public function setState($state) { $this->_state = $state; }
        public function getState() { return $this->_state; }
        public function showState() {
            echo $this->_state;echo "<br>";
        }
    
    }
    
    class Memento { // 备忘录(Memento)角色
        private $_state;
        public function __construct($state) {
            $this->setState($state);
        }
        public function getState() { return $this->_state; }
        public function setState($state) { $this->_state = $state;}
    }
    
    class Caretaker { // 负责人(Caretaker)角色
        private $_memento;
        public function getMemento() { return $this->_memento; }
        public function setMemento(Memento $memento) { $this->_memento = $memento; }
    }
    
    // client
    /* 创建目标对象 */
    $org = new Originator();
    $org->setState('open');
    $org->showState();
    
    /* 创建备忘 */
    $memento = $org->createMemento();
    
    /* 通过Caretaker保存此备忘 */
    $caretaker = new Caretaker();
    $caretaker->setMemento($memento);
    
    /* 改变目标对象的状态 */
    $org->setState('close');
    $org->showState();
    
    $org->restoreMemento($memento);
    $org->showState();
    
    /* 改变目标对象的状态 */
    $org->setState('close');
    $org->showState();
    
    /* 还原操作 */
    $org->restoreMemento($caretaker->getMemento());
    $org->showState();
    /* 输出:
    open
    close
    open
    close
    open */
    

      

    23种模式总览 : https://www.cnblogs.com/houss/p/11121584.html

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/houss/p/13246525.html
Copyright © 2011-2022 走看看