备忘录模式

发布于:2024-04-29 ⋅ 阅读:(27) ⋅ 点赞:(0)

备忘录模式

什么是备忘录模式

备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢
复到原先保存的状态

  • Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态
  • Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。.备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
  • Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

通过示例了解备忘录模式

在Java中实现备忘录(Memento)模式,我们需要创建以下三个关键角色:

  • Originator(发起人):这是拥有内部状态的对象,可以创建备忘录(Memento)对象来捕获其当前状态,并使用备忘录恢复到先前的状态。
  • Memento(备忘录):这是一个轻量级接口或类,存储了发起人的内部状态。通常只有发起人能访问备忘录的内部状态,以保护数据的完整性。
  • Caretaker(管理者):负责保存和管理备忘录对象,但不能直接访问备忘录的内部状态。它与发起人协同工作,为发起人提供备忘录以恢复状态,但不关心备忘录的具体内容。

1.发起人(Originator)类

public class Originator {
    private String state; // 发起人的内部状态

    public Originator(String initialState) {
        this.state = initialState;
    }

    // 创建备忘录的方法,返回一个包含当前状态的备忘录对象
    public Memento createMemento() {
        return new ConcreteMemento(state);
    }

    // 使用备忘录恢复状态的方法
    public void restoreFromMemento(Memento memento) {
        this.state = memento.getState();
    }

    // 其他业务方法,可能改变发起人的状态
    public void doSomethingThatChangesState() {
        // 假设这是一个复杂操作,改变了状态
        state = "Changed State";
    }

    @Override
    public String toString() {
        return "Originator State: " + state;
    }
}

2.备忘录(Memento)接口

public interface Memento {
    String getState();
}

3.具体备忘录(ConcreteMemento)类

public class ConcreteMemento implements Memento {
    private final String state;

    public ConcreteMemento(String state) {
        this.state = state;
    }

    @Override
    public String getState() {
        return state;
    }
}

4.管理者(Caretaker)类

public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();

    // 保存备忘录
    public void addMemento(Memento memento) {
        mementos.add(memento);
    }

    // 获取备忘录,供发起人恢复状态
    public Memento getMemento(int index) {
        return mementos.get(index);
    }
}

5.使用

public class Main {
    public static void main(String[] args) {
        // 创建发起人并设置初始状态
        Originator originator = new Originator("Initial State");

        System.out.println("Before change:");
        System.out.println(originator);

        // 创建管理者
        Caretaker caretaker = new Caretaker();

        // 发起人执行业务操作,改变状态
        originator.doSomethingThatChangesState();

        System.out.println("\nAfter change:");
        System.out.println(originator);

        // 发起人创建备忘录并交给管理者保存
        caretaker.addMemento(originator.createMemento());

        // 发起人再次改变状态
        originator.doSomethingThatChangesState();

        System.out.println("\nAfter further change:");
        System.out.println(originator);

        // 管理者提供备忘录给发起人,发起人恢复到之前保存的状态
        originator.restoreFromMemento(caretaker.getMemento(0));

        System.out.println("\nAfter restoring from memento:");
        System.out.println(originator);
    }
}

运行上述Main类,你会看到发起人在不同阶段的状态变化以及通过备忘录成功恢复到先前状态的过程。这个示例展示了备忘录模式如何帮助发起人安全地保存和恢复其内部状态,同时隔离了管理者与备忘录内部细节的直接接触。