zoukankan      html  css  js  c++  java
  • php备忘录模式

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

    记录目标对象某一状态。

      1 /**
      2  * 备忘录模式
      3  */
      4 
      5 /**
      6  * 发起人
      7  */
      8 
      9 class Originator{
     10 
     11     private $_state;
     12     
     13     public function __construct(){
     14     $this->_state='';
     15     }
     16     
     17     /**
     18      * 创建备忘录
     19      * @returnMem当前状态的备忘录对象
     20      */
     21     
     22     public function CreateMem(){
     23     
     24         return new Mem($this->_state);
     25     }
     26     /**
     27      * 将发起人恢复到备忘录对象记录的状态上
     28      * @param Mem $Mem
     29      */
     30     public function restoreMem(Mem $mem){
     31     
     32         $this->_state=$mem->getState();
     33     }
     34     
     35     public function setState($state){
     36     
     37         $this->_state=$state;
     38     }
     39     
     40     public function getState(){
     41     
     42         return $this->_state;
     43     }
     44     
     45     public function showState(){
     46     
     47         echo 'ORIGINAL STATUS:',$this->getState();
     48     
     49     }
     50 
     51 
     52 }
     53 
     54 
     55 class Mem{
     56 
     57     private $_state;
     58     
     59     public function __construct($state){
     60     
     61         $this->setState($state);
     62     
     63         
     64     }
     65     
     66     public function getState(){
     67     
     68         return $this->_state;
     69     
     70     }
     71     
     72     public function setState($state){
     73     
     74         $this->_state=$state;
     75     
     76     }
     77 
     78 }
     79 
     80 
     81 /**
     82  * 负责人角色
     83  */
     84 
     85 class Caretaker{
     86 
     87     private $_mem;
     88     
     89     function getMem(){
     90     return $this->_mem;
     91     
     92     }
     93     
     94     public function setMem(Mem $mem){
     95     
     96         $this->_mem=$mem;
     97     
     98     }
     99 
    100 }
    101 
    102 
    103 class Client{
    104 
    105 
    106     public static function main(){
    107     
    108         /**
    109          * 创建目标对象
    110          */
    111         $org=new Originator();
    112         
    113         $org->setState('open');
    114         
    115         $org->showState();
    116         
    117         /**
    118          * 创建备忘
    119          */
    120         $mem=$org->CreateMem();
    121         
    122         /**
    123          * caretaker
    124          * 保存
    125          */
    126       $caretaker=new Caretaker();
    127       
    128       $caretaker->setMem($mem);
    129       
    130       /**
    131        * 改变目标对象状态
    132        */
    133       $org->setState('close');
    134       $org->showState();
    135       
    136       
    137       /**
    138        * 还原状态
    139        */
    140       $org->restoreMem($caretaker->getMem());
    141       $org->showState();
    142       
    143         
    144     
    145     }
    146 
    147 }
    148 
    149 Client::main();
    View Code

    【备忘录模式中主要角色】
    1、备忘录(Memento)角色:
    存储发起人(Originator)对象的内部状态,而发起人根据需要决定备忘录存储发起人的哪些内部状态。
    备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

    2、发起人(Originator)角色:
    创建一个含有当前的内部状态的备忘录对象
    使用备忘录对象存储其内部状态

    3、负责人(Caretaker)角色:
    负责保存备忘录对象,不检查备忘录对象的内容

    【备忘录模式的优点和缺点】
    备忘录模式的优点:
    1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取。
    2、简化了发起人(Originator)类。发起人(Originator)不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理它们所需要的这些状态的版本
    3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

    备忘录模式的缺点:
    1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
    2、当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否会很昂贵。
    3、当发起人角色的状态改变的时候,有可能这个状态无效。

    【备忘录模式适用场景】
    1、必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
    2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

  • 相关阅读:
    chaos —— 混沌
    《菊与刀》original 的阅读
    《菊与刀》original 的阅读
    十六进制(二进制)编辑器
    十六进制(二进制)编辑器
    Hopfield 神经网络及稳态性的证明
    Hopfield 神经网络及稳态性的证明
    OpenGL(一)绘制圆、五角星、正弦曲线
    NYOJ 8 一种排序(comparator排序)
    oc 第五天(内存管理)
  • 原文地址:https://www.cnblogs.com/phplover/p/3089248.html
Copyright © 2011-2022 走看看