Java備忘錄模式

概念

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

角色

Originator(發(fā)起人):負責創(chuàng)建一個備忘錄Memento,用以記錄當前時刻自身的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Originator可以根據(jù)需要決定Memento存儲自己的哪些內(nèi)部狀態(tài)。

Memento(備忘錄):負責存儲Originator對象的內(nèi)部狀態(tài),并可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)。

Caretaker(管理者):負責備忘錄Memento,不能對Memento的內(nèi)容進行訪問或者操作。

源代碼

/**
 * 備忘錄類
 */
public class Memento {

    /**
     * 需要備份的相關(guān)數(shù)據(jù)
     */
    private String state1;
    private String state2;

    /**
     * 創(chuàng)建備忘錄時將相關(guān)數(shù)據(jù)導(dǎo)入
     * @param state1
     * @param state2
     */
    public Memento(String state1, String state2) {
        this.state1 = state1;
        this.state2 = state2;
    }

    //取出備份的數(shù)據(jù)
    public String getState1() {
        return state1;
    }

    public String getState2() {
        return state2;
    }
}
/**
 * 發(fā)起人類
 */
public class Originator {

    //需要保存的屬性
    private String state1;
    private String state2;

    /**
     * 創(chuàng)建備忘錄,將當前需要保存的數(shù)據(jù)導(dǎo)入并創(chuàng)建一個備忘錄對象
     * @return
     */
    public Memento createMemento(){
        return new Memento(state1, state2);
    }

    /**
     * 恢復(fù)數(shù)據(jù),將備忘錄導(dǎo)入并回復(fù)數(shù)據(jù)
     * @param memento
     */
    public void resetMemento(Memento memento){
        this.state1 = memento.getState1();
        this.state2 = memento.getState2();
    }

    public void show(){
        System.out.println("state1:" + state1);
        System.out.println("state2:" + state2);
    }

    public String getState1() {
        return state1;
    }

    public void setState1(String state1) {
        this.state1 = state1;
    }

    public String getState2() {
        return state2;
    }

    public void setState2(String state2) {
        this.state2 = state2;
    }
}
/**
 * 管理者,管理備忘錄
 */
public class Caretaker {

    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
/**
 * 客戶端
 */
public class Client {

    public static void main(String[] args) {
        //創(chuàng)建一個發(fā)起人
        Originator originator = new Originator();
        originator.setState1("mjp");
        originator.setState2("rtt");
        originator.show();

        //創(chuàng)建一個管理者
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        //狀態(tài)改變
        System.out.println("---狀態(tài)改變---");
        originator.setState1("馬俊鵬");
        originator.setState2("任婷婷");
        originator.show();

        //狀態(tài)恢復(fù)
        System.out.println("---狀態(tài)恢復(fù)---");
        originator.resetMemento(caretaker.getMemento());
        originator.show();
    }

}

總結(jié)

Memento模式適用于功能比較復(fù)雜,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一部分時,Originator可以根據(jù)保存的Memento信息還原特定的屬性到前一狀態(tài)。

如果在某個系統(tǒng)中使用命令模式時,需要實現(xiàn)撤銷命令的功能,那么命令模式可以使用備忘錄模式來存儲可撤銷操作的狀態(tài)。

使用備忘錄模式可以把復(fù)雜的對象內(nèi)部信息對其他的對象屏蔽起來,從而可以恰當?shù)谋3址庋b的邊界。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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