海角不转弯

代码是梦想的砖

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

记录目标对象某一状态。

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

posted on 2013-05-20 19:35  海角不转弯  阅读(209)  评论(0编辑  收藏  举报