• 抽丝剥茧——备忘录设计模式


    备忘录设计模式

    兄弟们好,今天来和大家聊聊备忘录设计模式。

    它的主要思想是:保存一个对象在某一时刻的副本,并且该对象的副本在外部不可以被访问,同时该对象的副本可以被内部重新加载和修改

    看到这里,有没有想到我们的序列化。在学习IO流的时候我们可以通过Serializable实现对象的序列化,这个序列化的过程就是一个备忘录的过程,通过对当前对象序列化,包含当前的状态,当需要的时候再将这个状态加载进来。

    我们常常见过的游戏存档就是这个实现原理,将所有涉及到对象全部序列化,包含再本地文件中,然后读档的时候再加载进去。

    我们来看一下它类图实现:

    它主要有三个角色:

    • Originator用来描述一个需要被进行备忘录的对象,它可以主动的创建一个备忘录,并且设置其状态
    • Memento备忘录对象,用来保存Originator对象的状态,提供两个接口用于读取和设置对象的状态
    • Caretake。执行具体的备忘录调用。对于它而言备忘录仅仅可以查看,但不能修改

    我们来看一下具体的代码实现:

    备忘录接口,一个标识

    interface Memento{
    
    }
    

    需要记录的对象,宽接口,可以访问备忘录的所有信息

    class Originator{
        private String state ;
    
        public Memento createMemento(){
            return new InnerMemento(state);
        }
    
        public void restoreState(Memento memento){
            this.state = ((InnerMemento)memento).getState();
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        class InnerMemento implements Memento{
            private String state ;
    
            public InnerMemento(String state){
                this.state = state ;
            }
    
            public void setState(String state) {
                this.state = state;
            }
    
            public String getState() {
                return state;
            }
        }
    }
    

    具体负责调用,窄接口,仅仅可以查看备忘录

    class Caretaker{
        private Originator originator ;
        public Caretaker(Originator originator){
            this.originator = originator ;
        }
        public Memento createMemento(){
            return originator.createMemento();
        }
        public void restoreState(Memento memento){
            originator.restoreState(memento);
        }
    }
    

    具体调用

    public static void main(String[] args) {
            Originator originator = new Originator();
            Caretaker caretaker = new Caretaker(originator);
            //保存当前状态
            Memento memento = caretaker.createMemento();
    
            originator.setState("我的");
            caretaker.createMemento();
        }
    

    有没有发现,这个设计模式强调了一个安全访问的原则,通过对不同的接口实现了一个宽接口和窄接口,来实现不同层次的调用。这个模式常常会和命令设计模式联合起来,用来记录undo操作,例如mysql持久化。

    好啦,今天的设计模式就到这里了,兄弟们,晚安。

  • 相关阅读:
    javase程序设计上机作业2
    操作系统课堂笔记——01,操作系统介绍
    javase程序设计上机作业1
    Matlab学习笔记1—MATLAB基础知识
    Matlab学习笔记0—课程导入
    【转】WEB技术发展简史
    leetcode-79-单词搜索(用dfs解决)
    leetcode-78-子集(用bfs解决)
    leetcode-74-搜索二维矩阵
    leetcode-46-全排列
  • 原文地址:https://www.cnblogs.com/onlyzuo/p/13904901.html
Copyright © 2020-2023  润新知