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

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品婷婷久久| 国产无遮挡吃胸膜奶免费看 | 亚洲中文无码永久免| 69视频在线是免费观看| 亚洲AV无码成人专区片在线观看| 丰满人妻一区二区三区免费视频| 国内精品99亚洲免费高清| 中文字幕免费在线看| 亚洲国产精品无码久久久蜜芽| 野花香在线视频免费观看大全| 亚洲精品成人片在线观看精品字幕 | 黄色网站软件app在线观看免费| 国产亚洲精品一品区99热| 久久国产乱子伦精品免费看| 2022年亚洲午夜一区二区福利| 1000部夫妻午夜免费| 亚洲人成高清在线播放| 国产精品久久久久久久久久免费 | 日韩亚洲人成在线| 国产男女猛烈无遮挡免费视频网站| 色综合久久精品亚洲国产| 亚洲成a人无码av波多野按摩| japanese色国产在线看免费| 亚洲av中文无码乱人伦在线r▽| 精品一区二区三区免费毛片爱| 亚洲日日做天天做日日谢| 国产最新凸凹视频免费| 在线免费观看伊人三级电影| 亚洲激情视频网站| 在线永久免费观看黄网站| 一级一级一级毛片免费毛片| 亚洲欧洲日产国产综合网| 四虎免费在线观看| a级毛片免费全部播放无码| 亚洲成a人片在线观| 四虎永久在线精品免费影视 | 亚洲成色在线综合网站| 毛片网站免费在线观看| 国产免费牲交视频免费播放 | 二区久久国产乱子伦免费精品| 久久久久亚洲AV无码网站|