<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 阿蜜果 閱讀(4462) 評論(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

    積分與排名

    • 積分 - 2294895
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费人成在线观看视频高潮| 亚洲人成欧美中文字幕| 国产精品偷伦视频免费观看了| 日日操夜夜操免费视频| 亚洲AV日韩AV无码污污网站 | 亚洲AV综合永久无码精品天堂| 91精品免费国产高清在线| 亚洲日韩国产精品无码av| 日本zzzzwww大片免费| 亚洲一区二区三区久久久久| 曰批全过程免费视频网址| 亚洲人成综合在线播放 | 日韩高清免费观看| 日韩亚洲人成在线综合| 五月婷婷亚洲综合| 韩日电影在线播放免费版| 亚洲av无码片在线播放| 亚洲精品视频免费在线观看| 久久亚洲精品国产亚洲老地址| 日本成人免费在线| 国产99视频精品免费视频76| 亚洲国产精品成人久久| 国产成人精品免费午夜app| 亚洲私人无码综合久久网| 无码不卡亚洲成?人片| 国产无遮挡裸体免费视频在线观看| 亚洲精品在线播放视频| 免费高清小黄站在线观看| 久香草视频在线观看免费| 亚洲视频在线观看| 热久久精品免费视频| 两个人看的www免费| 亚洲一级视频在线观看| 亚洲日韩涩涩成人午夜私人影院| 国产成人一区二区三区视频免费| 中文字幕亚洲综合小综合在线| 亚洲国产成人爱av在线播放| 久久久久成人精品免费播放动漫| 亚洲中文字幕无码久久2020| 亚洲区小说区图片区QVOD| 国产成人A在线观看视频免费|