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
  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/yxlaisj/p/10586064.html
Copyright © 2011-2022 走看看