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

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

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

    一、 模式定義:
    在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣就可以將該對象恢復(fù)到原先保存前的狀態(tài)。
    二、 模式解說
    在程序運行過程中,某些對象的狀態(tài)處在轉(zhuǎn)換過程中,可能由于某種原因需要保存此時對象的狀態(tài),以便程序運行到某個特定階段,需要恢復(fù)到對象之前處于某個點時的狀態(tài)。如果使用一些公有接口讓其它對象來得到對象的狀態(tài),便會暴露對象的實現(xiàn)細節(jié)。
    三、 結(jié)構(gòu)圖
     
    1) 備忘錄(Memento)角色:備忘錄角色存儲“備忘發(fā)起角色”的內(nèi)部狀態(tài)。“備忘發(fā)起角色”根據(jù)需要決定備忘錄角色存儲“備忘發(fā)起角色”的哪些內(nèi)部狀態(tài)。為了防止“備忘發(fā)起角色”以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口——對于備忘錄角色中存放的屬性是不可見的。“備忘發(fā)起角色”則能夠看到一個寬接口——能夠得到自己放入備忘錄角色中屬性。
    2) 備忘發(fā)起(Originator)角色:“備忘發(fā)起角色”創(chuàng)建一個備忘錄,用以記錄當前時刻它的內(nèi)部狀態(tài)。在需要時使用備忘錄恢復(fù)內(nèi)部狀態(tài)。
    3) 備忘錄管理者(Caretaker)角色:負責(zé)保存好備忘錄。不能對備忘錄的內(nèi)容進行操作或檢查。
    四、一個例子
    這個例子是我從網(wǎng)上找到的,我覺得它比較形象,就拿過來直接用了。下面是這個例子的代碼:
     class WindowsSystem{
     private String state;
     public Memento createMemento(){ //創(chuàng)建系統(tǒng)備份
      return new Memento(state);
     }
     public void restoreMemento(Memento m){ //恢復(fù)系統(tǒng)
      this.state=m.getState();
     }
     public String getState() {
      return state;
     }
     public void setState(String state) {
      this.state = state;
      System.out.println("當前系統(tǒng)處于"+this.state);
     }
     
    }
    class Memento{
     private String state;
     
     public Memento(String state) {
      this.state = state;
     }
     public String getState() {
      return state;
     }
     public void setState(String state) {
      this.state = state;
     }
    }
    class User{
     private Memento memento;
     public Memento retrieveMemento() {  //恢復(fù)系統(tǒng)
         return this.memento;
     }
     public void saveMemento(Memento memento){  //保存系統(tǒng)
         this.memento=memento;
     }
    }

    public class Test{

     public static void main(String[] args) {
     
       WindowsSystem Winxp = new WindowsSystem(); //Winxp系統(tǒng)
       User user = new User();   //某一用戶
       Winxp.setState("好的狀態(tài)");   //Winxp處于好的運行狀態(tài)
       user.saveMemento(Winxp.createMemento()); //用戶對系統(tǒng)進行備份,Winxp系統(tǒng)要產(chǎn)生備份文件
       Winxp.setState("壞的狀態(tài)");   //Winxp處于不好的運行狀態(tài)
       Winxp.restoreMemento(user.retrieveMemento());   //用戶發(fā)恢復(fù)命令,系統(tǒng)進行恢復(fù)
       System.out.println("當前系統(tǒng)處于"+Winxp.getState());
      }

    }
    在本例中,WindowsSystem是發(fā)起人角色(Orignation),Memento是備忘錄角色(Memento),User是備忘錄管理角色(Caretaker)。Memento提供了兩個接口(注意這里的接口,并不是java中的接口,它指的是可被外界調(diào)用的方法):一個是為WindowsSystem 類的寬接口,能夠得到WindowsSystem放入Memento的state屬性,代碼見WindowsSystem的createMemento方法和restoreMemento方法,createMemento方法向Memento放入state屬性,restoreMemento方法獲得放入的state屬性。另一個是為User類提供的窄接口,只能管理Memento而不能對它的內(nèi)容進行任何操作(見User類)。
    五、 優(yōu)缺點
    1) 保持封裝邊界 使用備忘錄可以避免暴露一些只應(yīng)由原發(fā)器管理卻又必須存儲在原發(fā)器之外的信息。該模式把可能很復(fù)雜的Originator內(nèi)部信息對其他對象屏蔽起來,從而保持了封裝邊界。
    2) 它簡化了原發(fā)器 在其他的保持封裝性的設(shè)計中,Originator負責(zé)保持客戶請求過的內(nèi)部狀態(tài)版本。這就把所有存儲管理的重任交給了Originator。讓客戶管理它們請求的狀態(tài)將會簡化Originator,并且使得客戶工作結(jié)束時無需通知原發(fā)器。
    3) 使用備忘錄可能代價很高 如果原發(fā)器在生成備忘錄時必須拷貝并存儲大量的信息,或者客戶非常頻繁地創(chuàng)建備忘錄和恢復(fù)原發(fā)器狀態(tài),可能會導(dǎo)致非常大的開銷。除非封裝和恢復(fù)Originator狀態(tài)的開銷不大,否則該模式可能并不合適。
    4) 維護備忘錄的潛在代價 管理器負責(zé)刪除它所維護的備忘錄。然而,管理器不知道備忘錄中有多少個狀態(tài)。因此當存儲備忘錄時,一個本來很小的管理器,可能會產(chǎn)生大量的存儲開銷。
    六、 適用性
    1)必須保存一個對象在某一個時刻的(部分)狀態(tài),這樣以后需要時它才能恢復(fù)到先前的狀態(tài)。
    2)如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性。
    七、參考
     http://tech.it168.com/n/d/2007-05-20/200705201437328.shtml
    http://www.cnblogs.com/John-zhaohui/archive/2007/08/20/862663.html
    http://www.cppblog.com/converse/archive/2006/08/09/11063.html
    http://java.ccidnet.com/art/3741/20030715/544777_1.html
    http://blog.csdn.net/qutr/archive/2006/08/01/1007600.aspx

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 中文字幕成人免费高清在线| 亚洲国产日韩在线一区| 精品亚洲福利一区二区| 国产免费毛不卡片| 亚洲一区二区影视| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 老司机永久免费网站在线观看| 亚洲一区二区三区深夜天堂| 免费v片在线观看视频网站| 亚洲黄色免费在线观看| 麻豆高清免费国产一区| 亚洲午夜一区二区三区| 成人免费淫片在线费观看| 春暖花开亚洲性无区一区二区| 免费国产美女爽到喷出水来视频| 精品成人一区二区三区免费视频 | 久草免费手机视频| 91大神亚洲影视在线| 手机看黄av免费网址| 午夜精品一区二区三区免费视频| 亚洲一区二区成人| 色爽黄1000部免费软件下载| 亚洲国产精品视频| 黄色网站软件app在线观看免费| 久久伊人久久亚洲综合| 99久久精品日本一区二区免费| 亚洲一区二区三区高清在线观看 | 亚洲午夜无码久久| 亚洲成人影院在线观看| 久热免费在线视频| 亚洲精品中文字幕无码A片老| 亚洲 自拍 另类小说综合图区 | 黄页免费的网站勿入免费直接进入| 亚洲欧美日韩一区二区三区在线| 国产黄色片在线免费观看| 97超高清在线观看免费视频| 亚洲精品免费在线视频| 亚洲av无码不卡私人影院| 好久久免费视频高清| 亚洲综合av一区二区三区不卡| 国产亚洲av片在线观看18女人|