备忘录模式

备忘录模式

文章目录

什么是备忘录模式

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

复到原先保存的状态

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

通过示例了解备忘录模式

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

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

1.发起人(Originator)类

java 复制代码
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)接口

java 复制代码
public interface Memento {
    String getState();
}

3.具体备忘录(ConcreteMemento)类

java 复制代码
public class ConcreteMemento implements Memento {
    private final String state;

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

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

4.管理者(Caretaker)类

java 复制代码
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.使用

java 复制代码
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类,你会看到发起人在不同阶段的状态变化以及通过备忘录成功恢复到先前状态的过程。这个示例展示了备忘录模式如何帮助发起人安全地保存和恢复其内部状态,同时隔离了管理者与备忘录内部细节的直接接触。

相关推荐
80530单词突击赢1 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
B站_计算机毕业设计之家6 分钟前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
渣渣苏14 分钟前
Langchain实战快速入门
人工智能·python·langchain
爬山算法21 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
lili-felicity23 分钟前
CANN模型量化详解:从FP32到INT8的精度与性能平衡
人工智能·python
数据知道26 分钟前
PostgreSQL实战:详解如何用Python优雅地从PG中存取处理JSON
python·postgresql·json
云姜.33 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农34 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧35 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..35 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范