zoukankan      html  css  js  c++  java
  • Java设计模式之行为型模式(备忘录模式)

    备忘录模式(Memento)

    1、背景

    在日常生活中,当我们重装电脑系统时,或多或少都会将之前的系统备份,以防日后电脑发生故障时能够及时恢复。备份思想无处不在,在编码工作中亦如此。Java是面向对象的编程语言,核心的思想就是对象。我们在使用对象的过程中,可能会频繁的修改对象的相关值,若这些相关值每一个都意义(或都很重要),就需要对以前的值进行备份操作。备忘录模式正是针对的对象的备份。

    2、概述

    ①定义

    备忘录模式将对象的数据做若干次备份,修改过后的对象可通过备份数据恢复。

    ②结构

    • 备份类(Memento),用于存储对象的备份数据
    • 备份仓库类(Warehouse),用于存储备份类
    • 要被备份的主体类(Info),有相关属性,和产生备份和恢复方法

    这里写图片描述

    ③优势

    • 有利于增强代码的健壮性
    • 有利于适应实际场景需求,增强其扩展性和可维护性

    3、实例分析

    本例依照本张UML图所写。代码已上注释。

    这里写图片描述

    /**
     * @author Hanlin Wang
     */
    
    public class MementoMode {
        public static void main(String[] args) {
            //添加三个备份:zhangsan、lisi、wangwu
            Info info = new Info("zhangsan");
            Memento backUp = info.backUp();
            Warehouse.addMemento(backUp);
    
            info.setValue("lisi");
            Memento backUp2 = info.backUp();
            Warehouse.addMemento(backUp2);
    
            info.setValue("wangwu");
            Memento backUp3 = info.backUp();
            Warehouse.addMemento(backUp3);
    
            //检查备份库
            Warehouse.check();
    
            System.out.println("-------");
            System.out.println(info.getValue());
            System.out.println("-------");
    
            //恢复为zhangsan
            info.restore(1);
    
            //备份后
            System.out.println(info.getValue());
        }
    }
    
    //定义被用来备份的类
    class Info{
        String value;
    
        public Info(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public Memento backUp(){
            return new Memento(this.value);
        }
    
        public void restore(){
            this.value = Warehouse.getMemento(Warehouse.version).getValue();
        }
    
        public void restore(Integer version){
            this.value = Warehouse.getMemento(version).getValue();
        }
    }
    
    //定义备份类
    class Memento{
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public Memento(String value) {
            this.value = value;
        }
    
    }
    
    //定义仓库类,存储备份类
    class Warehouse{
        private static HashMap<Integer, Memento> memento
                            = new HashMap<Integer, Memento>();
    
        public static int version = 0;
    
        public static Memento getMemento(Integer version) {
            return memento.get(version);
        }
    
        public static void addMemento(Memento memento) {
            Warehouse.memento.put(++version, memento);
        }
    
        public static void removeMemento(Integer version) {
            Warehouse.memento.remove(version);
        }
    
        public static void check(){
            Set<Entry<Integer, Memento>> entrySet = memento.entrySet();
            for (Entry<Integer, Memento> entry : entrySet) {
                Memento mem = entry.getValue();
                String value = mem.getValue();
                Integer version = entry.getKey();
                System.out.println("version : " + version + " | value : " + value);
            }
        }
    }

    分析:Memento为备份类,Info为主体类,Warehouse为备份仓库类。Info中存储value属性,并定义了backUp备份方法,该方法返回一个带有当前Info类对象的value值的Memento对象,定义了restore方法,恢复最近时间备份的数据(version值最大的Memento对象)。Memento定义了value属性,用于存储Info的value属性。Warehouse中定义Map< Integer, Memento> memento用于存储Memento对象,每个Memento对象在进入Warehouse时都会生成一个version版本号,定义了有关增改Memento的方法,check方法用于遍历所有的Memento对象及其自带的版本信息。

    运行结果:
    version : 1 | value : zhangsan
    version : 2 | value : lisi
    version : 3 | value : wangwu
    wangwu
    zhangsan

    Tips:”—–”在CSDN Markdown编辑器中被转意为标题,因此把它删除。

  • 相关阅读:
    List集合中的对象按照某个字段去重实现
    菜单--微信提醒
    fastTime从后台传过来显示格式的处理
    彻底卸载Oracle
    关于这次安装Oracle
    关于下拉选择删选最基本一例(分享内容)
    马拉松参赛人员显示(瞬逝版)
    马拉松参赛人员旧版本最终版(私藏版)
    win 10 初始环境变量
    AngularJS输出helloworld
  • 原文地址:https://www.cnblogs.com/wanxi/p/6476231.html
Copyright © 2011-2022 走看看