设计模式之备忘录模式

107 阅读1分钟

备忘录模式(Memento)

定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

使用场景

主要角色

  1. 发起人 Originator 需要备份的对象
  2. 看管人 Caretaker 保存备份的容器
  3. 备忘录 Memento 备份对象

类图

image-20240108154349260

示例代码

需要备份的对象

public class Originator {
    private String state1;
    private String state2;
    private String staten;

    void setState1(String state1) {
        this.state1 = state1;
    }

    String getState1() {
        return state1;
    }

    // 创建备忘录
    Memento createMemento() {
        Memento memento = new Memento();
        memento.setState1(state1);
        memento.setStaten(staten);
        return memento;
    }

    // 恢复状态
    void restoreMemento(Memento memento) {
        this.state1 = memento.getState1();
        this.staten = memento.getStaten();
    }
}

备份对象

@Data
public class Memento {
    private String state1;
    private String staten;
}

看管人:负责管理备份

public class Caretaker {
    private final Map<String,Memento> history = new HashMap<>();

    // 保存备忘录
    public void saveMemento(String name,Memento memento) {
        history.put(name,memento);
    }

    // 获取备忘录
    public Memento getMemento(String name) {
        return history.get(name);
    }
    public Memento removeMemento(String name) {
        return history.remove(name);
    }
}
public class Client {
    public static void main(String[] args) {
        // 创建发起人
        Originator originator = new Originator();

        // 创建负责人
        Caretaker caretaker = new Caretaker();

        // 设置发起人的状态
        originator.setState1("State 1");
        System.out.println("Current State: " + originator.getState1());

        // 保存状态
        caretaker.saveMemento("第一次备份", originator.createMemento());

        // 修改发起人的状态
        originator.setState1("State 2");
        System.out.println("Updated State: " + originator.getState1());

        // 恢复状态
        originator.restoreMemento(caretaker.getMemento("第一次备份"));
        System.out.println("Restored State: " + originator.getState1());
    }
}
Current State: State 1
Updated State: State 2
Restored State: State 1

备忘录模式与命令模式对比

  1. 两者都能实现回退与撤销操作
  2. 命令模式是通过反向命令实现的,只能逐步回退或撤销,备忘录模式生产生产当前对象的快照,可以恢复到任意备份点

工作中遇到场景