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编辑器中被转意为标题,因此把它删除。

原文地址:https://www.cnblogs.com/wanxi/p/6476231.html