设计模式从入门到放弃(五)备忘录模式

备忘录模式 Memento

  • 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
  • 简单的说将一个对象的一些属性 保存在一个Memento对象中,用一个Caretaker类来专门管理Mento对象,如果需要回滚到对象的某一个状态直接去Caretaker中去找对应的Memento回滚即可

核心角色

  • Originator 需要被保存状态的对象
  • Memento 备忘录对象用来保存记录Originator的一些状态属性
  • Caretaker 守护者对象用于保存Memento对象

UML 示意图

在这里插入图片描述

代码实现

// 原始对象
@Data
public class Original {

    private String state;

    public Memento saveMemento() {
        return new Memento(state);
    }

    public void rollback(Memento memento) {
        this.state = memento.getState();
    }
}
// 备忘录对象 用来保存原始对象状态
@Getter
public class Memento {
    public Memento(String state) {
        this.state = state;
    }

    private String state;

}

// 守护者类用于维护Memento备忘录
public class CareTaker {

    private List<Memento> mementos = new ArrayList<>();

    public void add(Memento memento){
        this.mementos.add(memento);
    }

    public Memento get(int index){
        return this.mementos.get(index);
    }

}
// 测试
public class MementoTest {

    public static void main(String[] args) {
        CareTaker careTaker = new CareTaker();
        Original original = new Original();
        original.setState("init state");
        System.out.println(original);
		// 保存备忘录到careTaker中
        careTaker.add(original.saveMemento());

        original.setState("state 2 ");
        System.out.println(original);

        original.setState("state 3");

        System.out.println(original);

        // 回退到最初状态
        original.rollback(careTaker.get(0));

        System.out.println(original);
    }

}

使用细节

  1. 如果原始类的成员变量需要保存的过多,会导致占用比较大的资源,每次保存都是要消耗内存
  2. 如果需要保存不同类型的状态或者更加明晰化的管理可以把Caretaker中的容器改成Map或者其他
  3. 在节约内存的角度上可以考虑让备忘录结合原型模式配合
    资源,每次保存都是要消耗内存
  4. 如果需要保存不同类型的状态或者更加明晰化的管理可以把Caretaker中的容器改成Map或者其他
  5. 在节约内存的角度上可以考虑让备忘录结合原型模式配合
  6. 适用于需要回滚的操作

猜你喜欢

转载自blog.csdn.net/woshiwjma956/article/details/105809435
今日推荐