zoukankan      html  css  js  c++  java
  • Java设计模式----备忘录模式

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


     

    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
  • 相关阅读:
    linux 常用命令
    git 常见命令
    合并两个有序链表---python
    Code Contract for .NET
    Kruskal最小生成树算法
    逻辑-哲学
    停机问题
    逆向工程
    .net framework
    python 类库
  • 原文地址:https://www.cnblogs.com/yxlaisj/p/10586064.html
Copyright © 2011-2022 走看看