posts - 297,  comments - 1618,  trackbacks - 0
                  備忘錄模式(Memento) 屬于對象的行為模式
                  備忘錄模式是我覺得最容易理解的一種模式,它的名字取得非常的貼切。
          1. 定義
                  在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
          2. 使用的原因
                   想要恢復對象某時的原有狀態
          3. 適用的情況舉例
                  有很多備忘錄模式的應用,只是我們已經見過,卻沒細想這是備忘錄模式的使用罷了,略略舉幾例:
                  eg1. 備忘錄在jsp+javabean的使用:
                     在一系統中新增帳戶時,在表單中需要填寫用戶名、密碼、聯系電話、地址等信息,如果有些字段沒有填寫或填寫錯誤,當用戶點擊“提交”按鈕時,需要在新增頁面上保存用戶輸入的選項,并提示出錯的選項。這就是利用JavaBean的scope="request"或scope="session"特性實現的,即是用備忘錄模式實現的。
                  eg2. 修理汽車的剎車時。首先移開兩邊的擋板,露出左右剎車片。只能卸下一片,這時另一片作為一個備忘錄來表明剎車是怎樣安裝的。在這片修理完成后,才可以卸下另一片。當第二片卸下時,第一片就成了備忘錄。
                  eg3. 都說人生沒有后悔藥可買,我們都在為所做的事付出著代價,但在軟世界里卻有“后悔藥”,我改變了某東西的某些狀態之后,只要我們之前保存了該東西的某狀態,我們就可以通過備忘錄模式實現該東西的狀態還原,其實這何嘗不是一個能使時光倒流的“月光寶盒”,總“神奇”一詞了得。
          4. 類圖結構及說明
                  1)類圖如下所示:
                   
                   2)類說明
                      
                       i)Memento:備忘錄角色,  主要負責的工作如下:
                           將發起人對象的內部狀態存儲起來;
                           可以保護其內容不被發起人(Originator)對象之外的任何對象所讀取。
                       ii)Originator:發起人角色,主要完成如下工作:
                           創建一個含有當前的內部狀態的備忘錄對象;
                           使用備忘錄對象存儲其內部狀態。
                       iii)Caretaker:負責人角色,完成工作如下:
                            負責保存備忘錄對象;
                            不保存備忘錄對象的內容。
          5. 使用舉例
                 1)需求
                   
          Amigo的mother對Amigo當前的狀態很不滿意:不愛打扮,做事拖拖拉拉,十足馬大哈。該mother想對Amigo進行改造,但又唯恐改造后還不如從前的Amigo好,有可能需要實現“時光倒流”功能。
                 2)分析
                    經過細細分析,這個狀態保存功能其實可以通過備忘錄模式來得到很好的實現,可通過備忘錄來保存Amigo當前的狀態:不愛打扮,做事拖拖拉拉,十足馬大哈,以及其它的N多優點(哈哈哈。。。),如果改造后的Amigo不如從前,那我們讓我們的“月光寶盒”來實現一下“時光倒流”,真神奇啊。。。
                3)代碼參考實現
                    i)發起人角色
                     
          public class Originator {
              
          private String state;

              
          /**
               * 工廠方法,返回一個新的備忘錄對象
                   
          */

              
          public Memento createMemento {
                  
          return new Memento(state);
              }


                  
          /**
                   * 將發起人恢復到備忘錄對象所記載的狀態
                   
          */

                  
          public void restoreMemento(Memento memento) {
                  
          this.state = memento.getState();
              }

           
                  
          //省略狀態state的getter和setter方法
          }
                    ii)備忘錄角色
                   
          public class Memento {
              
          private String state;

              
          /**
               * 構造函數
               
          */

              
          public Memento(String state) {
                  
          this.state = state;
              }

               
                  
          //省略state的getter和setter方法
          }
                   iii)負責人角色
           
          public class Caretaker {
              
          private Memento memento;
              
              
          /**
               * 備忘錄的取值方法
               
          */

              
          public Memento retrieveMemento {
                  
          return this.memento;
              }


              
          /**
               * 備忘錄的保存方法
               
          */

                  
          public void saveMemento(Memento memento) {
                  
          this.memento = memento;
              }

          }
                    iv)客戶端模擬實現
           
          public class Client {
              
          private static Originator ori = new Originator();
              
              
          private static Caretaker taker = new Caretaker();
                  
                  
          public static void main(String[] args) {
                  
          //amigo當前的狀態
                  ori.setState("不愛打扮,做事拖拖拉拉,十足馬大哈");
                  
          //保存amigo當前的狀態
                  taker.saveMemento(ori.createMemento());
                  
                  
          //mother要對amigo進行改造
                  ori.setState("穿著時髦,做事精練");

                  
          //mother發現改造后產生了很多副作用,于是反悔了,要恢復女兒以前的樣子
                          ori.restoreMemento(taker.retrieveMemento());
                          
                  
          //amigo被打回原型,^_^
                          System.out.println("amigo當前情況: " + ori.getState());
              }

          }
                   mother真是滴,一棍子將我打回原型了。
                   無語也。。。
          參考書籍:《Java與模式》
                              《Patterns in Java》
                              《深入簡出Java設計之備忘錄模式》http://www.pcdog.com/edu/java/2005/12/z059917_2.html
                               《軟件設計模式的非軟件例子》http://blog.csdn.net/gzzzz/archive/2004/10/04/124705.aspx
          posted on 2007-04-12 00:11 阿蜜果 閱讀(4465) 評論(6)  編輯  收藏 所屬分類: Design Pattern


          FeedBack:
          # re: 設計模式學習筆記--備忘錄模式(Memento)
          2007-04-12 08:32 | ant
          很棒!有深度的一篇,^_^。  回復  更多評論
            
          # re: 設計模式學習筆記--備忘錄模式(Memento)
          2007-04-12 09:02 | 壞男孩
          up  回復  更多評論
            
          # re: 設計模式學習筆記--備忘錄模式(Memento)
          2007-04-12 09:08 | 壞男孩
          建議把java的設計模式都用你自己的生活體會替代,我相信到時候大家都會了解amigo的,比如通過這篇我就知道amigo-樸實,落落大方,而且善于觀察和思考!  回復  更多評論
            
          # re: 設計模式學習筆記--備忘錄模式(Memento) [未登錄]
          2007-04-12 10:11 | 阿蜜果
          @壞男孩
          貌似是個好建議  回復  更多評論
            
          # re: 設計模式學習筆記--備忘錄模式(Memento)
          2007-04-12 11:13 | 嘎嘎
          繼續崇拜中。。。  回復  更多評論
            
          # re: 設計模式學習筆記--備忘錄模式(Memento)
          2007-06-28 17:37 | chars
          還不錯,但是封裝性不是很好,沒有較好的利用寬窄接口,不過很好理解  回復  更多評論
            
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永靖县| 潢川县| 乌兰浩特市| 日喀则市| 会同县| 杨浦区| 铁岭县| 礼泉县| 固镇县| 虞城县| 江油市| 吉木萨尔县| 孝昌县| 灵寿县| 翼城县| 离岛区| 油尖旺区| 元阳县| 江达县| 桑日县| 电白县| 苍山县| 巴彦淖尔市| 印江| 邵阳市| 江源县| 德阳市| 河南省| 孟村| 阳江市| 天峻县| 南通市| 株洲县| 张家川| 陕西省| 黔西| 晋城| 定南县| 杭州市| 漳州市| 松江区|