java设计模式(行为型)之备忘录模式

第0章:简介

备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

备忘录模式本质:保存和恢复内部状态

参考:研磨设计模式(书籍),大话设计模式(书籍)

模式图:

待补充


第1章:实践

(1)备忘录接口(Memento.java)

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

/**
 * 备忘录接口,窄接口,即没有任何方法定义的空接口
 *
 * @author menergy
 *         DateTime: 14-3-16  下午10:50
 */
public interface Memento {
    //空接口
}

(2)原发器对象(Originator.java)

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

/**
 * 原发器对象,即使用备忘录保存和恢复自身状态的对象
 *
 * @author menergy
 *         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 menergy
 *         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 menergy
 *         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());


    }
}


你可能感兴趣的:(java设计模式,java设计模式,备忘录模式,行为型模式)