您的位置:首页 > 编程语言 > Java开发

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

2014-03-17 17:44 465 查看

第0章:简介

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

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

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

模式图:

待补充

第1章:实践

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

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

/**

 * 备忘录接口,窄接口,即没有任何方法定义的空接口

 *

 * @author <a href="mailto:417877417@qq.com">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:417877417@qq.com">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:417877417@qq.com">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:417877417@qq.com">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());

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息