天天看點

備忘錄模式 - 行為模式

個人了解:    

模式類型:

    Memento 備忘錄模式 - 行為模式

意圖:

    The intent of this pattern is to capture the internal state of an object without violating encapsulation and thus providing a mean for restoring the object into initial state when needed.

    在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣就可以将該對象恢複到原先儲存的狀态

概述:

    備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是對象的行為模式。

    備忘錄對象是一個用來存儲另外一個對象内部狀态的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,将一個對象的狀态捕捉(Capture)住,并外部化,存儲起來,進而可以在将來合适的時候把這個對象還原到存儲起來的狀态。備忘錄模式常常與指令模式和疊代子模式一同使用。

角色:

    将發起人(Originator)對象的内戰狀态存儲起來。備忘錄可以根據發起人對象的判斷來決定存儲多少發起人(Originator)對象的内部狀态。

    備忘錄可以保護其内容不被發起人(Originator)對象之外的任何對象所讀取。

    備忘錄有兩個等效的接口:

    窄接口:負責人(Caretaker)對象(和其他除發起人對象之外的任何對象)看到的是備忘錄的窄接口(narrow interface),這個窄接口隻允許它把備忘錄對象傳給其他的對象。

    寬接口:與負責人對象看到的窄接口相反的是,發起人對象可以看到一個寬接口(wide interface),這個寬接口允許它讀取所有的資料,以便根據這些資料恢複這個發起人對象的内部狀态。

結構圖:

備忘錄模式 - 行為模式

模式的應用場景:

如果有需要提供復原操作的需求,使用備忘錄模式非常适合,比如jdbc的事務操作,文本編輯器的Ctrl+Z恢複等。

模式的優缺點:

備忘錄模式的優點有:

    當發起人角色中的狀态改變時,有可能這是個錯誤的改變,我們使用備忘錄模式就可以把這個錯誤的改變還原。

    備份的狀态是儲存在發起人角色之外的,這樣,發起人角色就不需要對各個備份的狀态進行管理。

備忘錄模式的缺點:

    在實際應用中,備忘錄模式都是多狀态和多備份的,發起人角色的狀态需要存儲到備忘錄對象中,對資源的消耗是比較嚴重的。

代碼(其實讀UML圖要比代碼還要一目了然):

package com.lee.desingerPattener23.snapshot.whitebox1;

public class Client {
    public static void main(String[] args) {
        Originator o = new Originator();
        Caretaker c = new Caretaker();
        //改變負責人對象的狀态
        o.setState("On");
        //建立備忘錄對象,并将發起人對象的狀态儲存起來
        c.saveMemento(o.createMemento());
        //修改發起人的狀态
        o.setState("Off");
        //恢複發起人對象的狀态
        o.restoreMemento(c.retrieveMemento());
        System.out.println("o.getState():"+o.getState()+",c.getState:"+c.retrieveMemento().getState());
    }

}
class Caretaker {
    private Memento memento;
    /**
     * 備忘錄的取值方法
     * 相當于public Memento getMemento()
     */
    public Memento retrieveMemento(){
        return this.memento;
    }
    /**
     * 備忘錄的指派方法
     */
    public void saveMemento(Memento memento){
        this.memento = memento;
    }
}
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 Originator {
    private String state;
    /**
     * 工廠方法,傳回一個新的備忘錄對象
     */
    public Memento createMemento(){
        return new Memento(state);
    }
    /**
     * 将發起人恢複到備忘錄對象所記載的狀态
     */
    public void restoreMemento(Memento memento){
        this.state = memento.getState();
    }
    
    public String getState() {
        return state;
    }
    
    public void setState(String state) {
        this.state = state;
        System.out.println("目前狀态:" + this.state);
    }
}		
           

所有模式:

     建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

    行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

    補充模式:空對象模式

參考/轉自:

http://www.cnblogs.com/xudong-bupt/p/3617860.html

http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html【介紹的挺全面】

http://www.oodesign.com/memento-pattern.html

轉載請注明: http://blog.csdn.net/paincupid/article/details/46983185

繼續閱讀