java設計模式(行爲型)之備忘錄模式

第0章:簡介

備忘錄模式定義:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態

備忘錄模式本質:保存和恢復內部狀態

參考:研磨設計模式(書籍),大話設計模式(書籍)

模式圖:

待補充


第1章:實踐

(1)備忘錄接口(Memento.java)

package com.mcc.core.designPattern.behavior.memento;

/**
 * 備忘錄接口,窄接口,即沒有任何方法定義的空接口
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午10:50
 */
public interface Memento {
    //空接口
}

(2)原發器對象(Originator.java)

package com.mcc.core.designPattern.behavior.memento;

/**
 * 原發器對象,即使用備忘錄保存和恢復自身狀態的對象
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午10:52
 */
public class Originator {

    //原發器的狀態數據
    private Integer data = 0;

    /**
     * 獲取原生器數據
     * @return
     */
    public Integer getData() {
        return data;
    }

    /**
     * 數據寫入備忘錄。創建備忘錄對象並保存原發器的狀態數據,數據的中間態,後面需再次用到此狀態下得數據
     * @return
     */
    public Memento createMemento(){
        return new MementoImpl(data);
    }

    /**
     * 讀取備忘錄數據。重新設置原發器的的數據爲中間態數據,原發器重回到寫入備忘錄時的狀態
     */
    public void resetData(Memento memento){
        //獲得備忘錄
        MementoImpl mementoImpl = (MementoImpl)memento;
        //用備忘錄數據重置原發器數據
        this.data = mementoImpl.getStateData();
    }

    /**
     * 流程1,公共流程,此流程產生的數據將記錄進備忘錄,供後面不同流程分支重複使用
     */
    public void methodStep1(){
        data = data + 5;
    }

    /**
     * 流程2的A分支,分支流程,需用到流程1產生的數據,即備忘錄中的數據
     */
    public void methodStep2A(){
        data = data + 10;
    }

    /**
     * 流程2的B分支,分支流程,需用到流程1產生的數據,即備忘錄中的數據
     */
    public void methodStep2B(){
        data = data * 10;
    }

    /**
     *  備忘錄對象,用了保存原發器的中間態數據,是私有的類級內部類,不讓外部直接訪問
     */
    private static class MementoImpl implements Memento{
       //狀態數據,是原發器某一時刻的中間態數據
        private Integer stateData = null;

        /**
         * 構造器,傳入中間態數據
         * @param stateData
         */
        public MementoImpl(Integer stateData){
            this.stateData = stateData;
        }

        /**
         * 創建後,一般外部不能再修改數據,只能讀取數據,所以沒有相應的setter方法
         * @return
         */
        public Integer getStateData(){
            return stateData;
        }

    }
}

(3)備忘錄管理者(MenentoTaker.java)

package com.mcc.core.designPattern.behavior.memento;

/**
 * 備忘錄持有者,用了保存備忘錄
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午11:41
 */
public class MenentoTaker {

    //持有備忘錄對象
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

(4)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.memento;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-16  下午11:48
 */
public class Client {

    public static void main(String args[]){

        //原生器
        Originator originator = new Originator();

        System.out.println("運行流程1,原生數據初始化爲0,流程將數據加5");
        originator.methodStep1();
        //創建備忘錄,記錄中間態數據
        Memento memento = originator.createMemento();
        //將備忘錄交給備忘錄管理者管理
        MenentoTaker menentoTaker = new MenentoTaker();
        menentoTaker.setMemento(memento);
        System.out.println("流程1完成,原生數據爲:" + originator.getData());

        //從備忘錄管理者中獲取備忘錄
        Memento memento2A = menentoTaker.getMemento();
        //重置原生器數據爲備忘錄數據
        originator.resetData(memento2A);
        System.out.println("重置原生器數據爲:" + originator.getData());
        System.out.println("運行流程2的A分支,流程將加10");
        //運行流程2的A分支
        originator.methodStep2A();
        System.out.println("流程2的A分支完成,原生數據爲" + originator.getData());

        //從備忘錄管理者中獲取備忘錄
        Memento memento2B = menentoTaker.getMemento();
        //重置原生器數據爲備忘錄數據
        originator.resetData(memento2B);
        System.out.println("重置原生器數據爲:" + originator.getData());
        System.out.println("運行流程2的B分支,流程將乘以10");
        //運行流程2的B分支
        originator.methodStep2B();
        System.out.println("流程2的B分支完成,原生數據爲" + originator.getData());


    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章