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、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

  • 相关阅读:
    hdu 4002 Find the maximum
    hdu 2837 坑题。
    hdu 3123
    zoj Treasure Hunt IV
    hdu 2053 Switch Game 水题一枚,鉴定完毕
    poj 1430 Binary Stirling Numbers
    hdu 3037 Saving Beans
    hdu 3944 dp?
    南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。
    fzu 2171 防守阵地 II
  • 原文地址:https://www.cnblogs.com/phplover/p/3089248.html
Copyright © 2011-2022 走看看