設(shè)計模式之備忘錄模式

備忘錄模式(Memento),再不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。

適用場景

  1. Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分是,Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。
  2. 如果某個系統(tǒng)中使用命令模式時,需要實(shí)現(xiàn)命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲可撤銷的狀態(tài)。
  3. 當(dāng)角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復(fù)原。

優(yōu)點(diǎn)

要保存的細(xì)節(jié)封裝在了Memento中,如果需要修改保存的細(xì)節(jié),這個時候不會影響客戶端。

缺點(diǎn)

角色狀態(tài)需要完整存儲到備忘錄對象中,如果狀態(tài)數(shù)據(jù)很大很多,那么在資源消耗上,備忘錄對象會非常耗內(nèi)存。

UML結(jié)構(gòu)圖

MementoPattern

源碼

Memento:備忘錄類

/**
 * 備忘錄類
 *
 * Created by zhenguo on 11/30/14.
 */
public class Memento {

    private String state;

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

    public String getState() {
        return state;
    }
}

Originator:發(fā)起人

/**
 * 發(fā)起人
 *
 * Created by zhenguo on 11/30/14.
 */
public class Originator {

    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

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

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

    public void show() {
        System.out.println("Current State : " + state);
    }

}

Caretaker:管理者類

/**
 * 管理者類
 *
 * Created by zhenguo on 11/30/14.
 */
public class Caretaker {

    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

Client:客戶端調(diào)用

/**
 * 客戶端調(diào)用
 * 備忘錄模式(Memento),再不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
 * 這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。
 *
 * Created by zhenguo on 11/30/14.
 */
public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("On");
        originator.show();

        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        originator.setState("Off");
        originator.show();

        originator.setMemento(caretaker.getMemento());
        originator.show();

    }

}

設(shè)計模式系列:

創(chuàng)建型 結(jié)構(gòu)型 行為型
工廠方法
簡單工廠
抽象工廠
建造者模式
單例模式
原型模式
組合模式
外觀模式
橋接模式
代理模式
享元模式
適配器模式
裝飾模式
策略模式
模板方法
狀態(tài)模式
觀察者模式
備忘錄模式
迭代器模式
命令模式
職責(zé)鏈模式
解釋器模式
訪問者模式
中介者模式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容