侧边栏壁纸
  • 累计撰写 52 篇文章
  • 累计创建 22 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

备忘录模式(Memento Pattern)

镇沛
2024-10-07 / 0 评论 / 0 点赞 / 18 阅读 / 0 字

概述

备忘录模式是一种行为设计模式,它提供了一种在不破坏封装性的前提下,捕获并外部化对象内部状态的能力。这样一来,对象可以在将来某个时刻恢复到之前的状态。这种模式非常适合需要实现撤销操作的场景,比如文本编辑器的撤销功能、游戏的存档与读档等。

目的

  • 保存状态:允许对象将其当前状态保存起来,以便之后可以恢复。

  • 保持封装性:确保状态的存储对其他对象不可见,以保护内部信息的安全。

  • 支持撤销操作:简化实现撤销和重做功能的过程。

角色

  • Originator(发起人):负责创建和恢复备忘录的类。它定义了一个接口用以获取它的当前状态,并使用备忘录恢复其内部状态。

  • Memento(备忘录):用于存储Originator对象的内部状态。备忘录类可以原封不动地存储Originator对象的私有信息,但除了Originator自己之外,其他对象不能访问这些信息。

  • Caretaker(管理者):负责保存备忘录对象,但不能对备忘录的内容进行操作或直接访问。它只是提供了一个存储结构来持有备忘录对象。

实现步骤

  1. 定义Originator类:包含创建备忘录的方法(createMemento())和恢复备忘录的方法(restoreMemento())。

  2. 定义Memento类:存储Originator对象的状态信息。通常会根据实际情况选择将其属性设置为私有,以保证封装性。

  3. 定义Caretaker类:用来管理备忘录对象,通常是一个简单的容器类,不涉及备忘录内容的具体操作。

  4. 使用模式:在需要保存状态时,由Originator创建一个备忘录对象;Caretaker负责存储这个备忘录。当需要恢复状态时,Caretaker将备忘录传递给Originator,由Originator调用恢复方法进行状态恢复。

代码示例

// Memento类
class Memento {
    private String state;

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

    String getState() {
        return state;
    }
}

// Originator类
class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
        System.out.println("Originator: State set to " + state);
    }

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

    public void restoreMemento(Memento memento) {
        state = memento.getState();
        System.out.println("Originator: State restored to " + state);
    }

    public String getState() {
        return state;
    }
}

// Caretaker类
class Caretaker {
    private Memento memento;

    public void setMemento(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }
}

// 客户端代码
public class MementoPatternDemo {

    public static void main(String[ ] args) {

        Originator originator = new Originator();
        originator.setState("State1");
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        originator.setState("State2");
        System.out.println("Current State: " + originator.getState());

        originator.restoreMemento(caretaker.getMemento());
    }
}

应用场景

  • 当需要实现撤销/重做功能时。

  • 需要保存和恢复对象的内部状态,但又不想暴露这些状态的细节时。

  • 在不影响对象自身接口设计的情况下,提供一种灵活的状态恢复机制。

总结

备忘录模式通过将对象的状态封装在备忘录中,使得对象可以在不影响当前状态的情况下,灵活地回滚到之前的状态。它通过明确分离状态的备份与恢复责任,提高了软件的灵活性和可维护性。

0

评论区