设计模式-备忘录模式

1.定义

可以使对象可以返回到之前的状态,如撤销操作、或者学习系统上记住之前的学习状态等

2.使用场景及设计

2.1.使用场景

常用在系统中保存用户之前的状态及游戏的存档等。

2.2.设计

类图如下,其中Memento类用来保存状态,ManageMemento用来存取档,Client为客户端
设计模式-备忘录模式

3.测试代码

入口代码

package com.glt.designpattern.Memento;

public class InitMain {
    public static void main(String[] args) {

        Client c = new Client();

        c.startGame(null);
        c.player("1");
        c.player("2");
        Memento memento = c.exitGame();//退出
        ManageMemento.setMemento(memento);//存档


        Client c2 = new Client();
        c2.startGame(ManageMemento.getMemento());//加载档案
        c2.showPlayer();
        c2.player("5");
    }
}

备忘录类

package com.glt.designpattern.Memento;

/**
 * 备忘录类
 */
public class Memento {
    private String status;

    public String getCurrStatus(){
        return status;
    }

    public void saveStatus(String curr){
        this.status = curr;
    }
}

备忘录管理类,此种方式只能存放一个状态,使用集合可以存档多种状态

package com.glt.designpattern.Memento;

/**
 * 备忘录管理类,用来记录存档与获取
 */
public class ManageMemento {

    static Memento memento;

    public static Memento getMemento() {
        return memento;
    }

    public static void setMemento(Memento m) {
        memento = m;
    }
}

package com.glt.designpattern.Memento;

public class Client {

    Memento memento;

    public void startGame(Memento m){
        this.memento = m;
        if(memento==null){
            memento = new Memento();
        }
        System.out.println(" init LastStatus " + memento.getCurrStatus());

    }

    public void showPlayer(){
        System.out.println(" current player stats : " + memento.getCurrStatus());
    }

    public void player(String s){
        memento.saveStatus(s);
        System.out.println(" player currStatus " + memento.getCurrStatus());

    }

    public Memento exitGame(){
        if(memento==null){
            memento = new Memento();
        }
        return memento;
    }
}

输出如下

init LastStatus null
player currStatus 1
player currStatus 2
init LastStatus 2
current player stats : 2
player currStatus 5
Process finished with exit code 0

4.总结

优点:

  • 存储关键对象的重要状态
  • 可以通过备忘录实现用户撤销等

缺点:
成员对象多,如果备忘录过大会很消耗资源