reupe

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

电子游戏过去都会有一个“记录”或者“存盘”的功能,就是当玩家在游戏过程中将当前的游戏状态记录下来,以便于之后重新登录游戏后读取到记录时的状态。这种将对象的状态先保存起来,以后再根据保存的数据恢复对象状态的设计模式,就是备忘录模式。

 


 

1. 备忘录模式

 

备忘录模式(Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

 

备忘录模式的UML类图为:

 

  • Originator: 发起人,负责创建一个Memento对象,以记录它当前的内部状态。Originator可以根据需要,决定Memento保存哪些内部状态;
  • Memento:备忘录, 保存Originator的内部状态,并防止其它对象访问Originator的状态;
  • Caretaker:管理者, 负责保存Memento对象列表,将Memento对象保存在一个聚合对象中,恢复时可以获取Memento。

2. 代码实现

假设在玩一款游戏, Orininator 状态state, 代表当前对象的血量。备忘录定义Originator的静态内部类。

class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return this.state;
    }

    /**
     * 保存当前状态到备忘录
     */
    public Memento saveToMemento() {
        System.out.println("Saving current state: " + state);
        return new Memento(this.state);
    }

    /**
     * 读取备忘录,恢复保存的状态
     */
    public void restoreState(Memento memento) {
        System.out.println("Restore state");
        this.state = memento.getSavedState();
    }


    /**
     * 备忘录,存储当前Originator状态
     */
    public static class Memento {
        final String state;

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

        public String getSavedState() {
            return this.state;
        }

    }

}

 

管理备忘录

/**
 * 管理者
 */
class Caretaker {
    private final Map<String, Originator.Memento> mementoMap = new HashMap<>();

    /**
     * 保存状态
     */
    public synchronized void addMemento(String id, Originator.Memento memento) {
        mementoMap.put(id, memento);
    }

    /**
     * 读取状态
     */
    public synchronized Originator.Memento getMemento(String id) {
        return mementoMap.get(id);
    }

    /**
     * 删除状态
     */
    public synchronized Originator.Memento deleteMemento(String id) {
        return mementoMap.remove(id);
    }

}

 

演示

public class MementoDemo {
    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        Originator originator = new Originator();
        //设置状态:满血
        originator.setState("Full Blood");
        //保存当前状态
        caretaker.addMemento("1",originator.saveToMemento());

        //状态改变:半血
        originator.setState("Half Blood");
        System.out.println(originator.getState());
        //读取保存状态
        originator.restoreState(caretaker.getMemento("1"));
        System.out.println(originator.getState());

    }

}

 

运行结果

Saving current state: Full Blood
Half Blood
Restore state
Full Blood

 

posted on 2019-03-28 19:41  yxlaisj  阅读(269)  评论(0编辑  收藏  举报