设计模式之:备忘录模式

业务场景

(1)某个类,计算出来一份中间数据
(2)这个类,之后需要基于这份中间数据再执行另外两次操作,每次操作都要基于这份中间数据去执行
(3)第一次基于中间数据操作过后,会对中间数据做出修改
(4)要求是第二次再执行操作的时候,需要基于未修改之前的中间数据来执行

备忘录模式看起来有点复杂,其实不复杂,说白了,就是一个类一开始生产了一些数据,这些数据可能会被改变,但是需要将这些中间数据保存起来,给后面不同的操作使用这些中间数据

所以备忘录,顾名思义,就是用备忘录来保存中间数据,后面随时可以获取备忘录里的数据并且恢复这些数据

例如广告系统,N个子系统,某一个子系统跟下游的子系统之间是基于MQ去通信的。但是此时要考虑说MQ如果挂了怎么办,写消息到MQ的子系统,一旦发现MQ挂了,将数据写入磁盘,暂存。后面MQ恢复了,再从磁盘里恢复这个数据。

但是这个模式其实使用场景很少见,属于冷门模式

public class MementoPatternDemo {

    public static void main(String[] args) {
        Originator originator = new Originator();
        // 准备好了中间数据
        originator.prepare();
        // 将中间数据保存到备忘录中去
        Memento memento = originator.createMemento();
        // 将备忘录保存到备忘录管理器中去
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(memento);
        // 基于中间数据执行了A方法,但是此时中间数据已经改变了
        originator.executeA();
        // 从备忘录管理器中获取备忘录
        memento = caretaker.retrieveMemento();
        // 将备忘录中保存好的中间数据重新设置到原发器中去,就将中间数据恢复成了之前备忘的状态
        originator.setMemento(memento);
        // 接着再次执行方法B
        originator.executeB();

        /**
         * 面临的场景
         * 你的系统会生产出来一份中间数据,这份中间数据要么是没法一直在内存里保留,要么是可能会被修改
         * 所以逼得你迫不得已,必须得通过备忘录的方式,将中间数据暂存一份儿
         * 在一堆操作过后,可能之前内存中的中间数据都弄丢了,也可能中间数据被人篡改了
         * 接下来,你需要从备忘录中恢复我们的中间数据
         * 基于恢复后的中间数据,再次执行后面的操作
         */
    }

    public interface Memento {

    }

    public static class Originator {

        private String state;

        public void prepare() {
            this.state = "中间数据";
        }

        public void executeA() {
            System.out.println("基于中间数据【" + state + "】执行了A方法的逻辑");
            // 将state所代表的中间数据做出了修改
            state += ",A方法的结果数据";
        }

        public void executeB() {
            System.out.println("基于中间数据【" + state + "】执行了B方法的逻辑");
            state += ",B方法的结果数据";
        }

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

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

        private static class MementoImpl implements Memento {

            private String state;

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

            public String getState() {
                return state;
            }
        }
    }

    public static class Caretaker {

        private Memento memento;

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

        public Memento retrieveMemento() {
            return this.memento;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值