zoukankan      html  css  js  c++  java
  • 抽丝剥茧——备忘录设计模式

    备忘录设计模式

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

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

    看到这里,有没有想到我们的序列化。在学习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持久化。

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

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/onlyzuo/p/13904901.html
Copyright © 2011-2022 走看看