备忘录模式

备忘录模式

文章目录

什么是备忘录模式

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

相关推荐
hashiqimiya1 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua661 小时前
Python任务调度模型
java·运维·python
結城2 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马2 小时前
java教程笔记(十一)-泛型
java·笔记·python
sjtu_cjs2 小时前
Tensorrt python api 10.11.0笔记
开发语言·笔记·python
东阳马生架构2 小时前
商品中心—2.商品生命周期和状态的技术文档
java
哆啦A梦的口袋呀2 小时前
深入理解系统:UML类图
开发语言·python·uml
虎冯河2 小时前
怎么让Comfyui导出的图像不包含工作流信息,
开发语言·python
星辰离彬2 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
java·spring boot·后端·sql·mysql·性能优化
q_19132846952 小时前
基于Springboot+Vue的办公管理系统
java·vue.js·spring boot·后端·intellij idea