备忘录模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了备忘录模式相关的知识,希望对你有一定的参考价值。

重要程度:★★☆☆☆

一、什么是备忘录模式

保存对象的某个状态并可以恢复到该状态

二、补充说明

例子很多,如回退 ctri + z,回滚,ps恢复到操作历史的某一刻等等。。。

三、角色

备忘录角色:存储状态

发起人角色:创建备忘录,并利用备忘录存储自己的状态

负责人:管理备忘录

客户端

四、例子,JAVA实现

例子描述:显示一个对象的历史状态

备忘录角色

package com.pichen.dp.behavioralpattern.memento;

public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

发起人角色

package com.pichen.dp.behavioralpattern.memento;
public class State {

    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    
    public Memento saveToMemento(){
        return new Memento(state);
    }
    
    public void restoreFromMemento(Memento memento){
        this.state = memento.getState();
    }
}

备忘录管理者

package com.pichen.dp.behavioralpattern.memento;

import java.util.ArrayList;
import java.util.List;

public class MementoMgt {

    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index){
          return mementoList.get(index);
    }

    public List<Memento> getMementoList() {
        return mementoList;
    }

}

客户端Main

package com.pichen.dp.behavioralpattern.memento;
public class Main {

    public static void main(String[] args) {
        State state = new State();
        MementoMgt mementoMgt = new MementoMgt();
        
        state.setState("state1");
        mementoMgt.add(state.saveToMemento());
        state.setState("state2");
        mementoMgt.add(state.saveToMemento());
        state.setState("state3");
        mementoMgt.add(state.saveToMemento());
        state.setState("state4");
        mementoMgt.add(state.saveToMemento());
        
        System.out.println("状态历史:");
        for(Memento m:mementoMgt.getMementoList()){
            System.out.println(m.getState());
        }
        
        System.out.println("当前状态:");
        System.out.println(state.getState());
        state.setState(mementoMgt.getMementoList().get(1).getState());
        System.out.println("恢复后的状态:");
        System.out.println(state.getState());
    }
}

结果打印:

状态历史:
state1
state2
state3
state4
当前状态:
state4
恢复后的状态:
state2

 

以上是关于备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

(十三)备忘录模式-代码实现

19-备忘录(Memento)模式Ruby实现

设计模式----备忘录模式

设计模式14:备忘录模式

设计模式之备忘录模式