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

备忘录设计模式

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

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

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

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

咱们来看一下它类图实现:安全

它主要有三个角色:学习

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

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

备忘录接口,一个标识设计

interface Memento{

}

须要记录的对象,宽接口,能够访问备忘录的全部信息rest

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;
        }
    }
}

具体负责调用,窄接口,仅仅能够查看备忘录code

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持久化。

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

相关文章
相关标签/搜索