Java设计模式之备忘录(Memento)模式

备忘录(Memento)模式是一种用于实现对象状态保存和恢复的设计模式,它可以实现对象状态的快照、历史记录等功能。

什么是备忘录模式

备忘录模式其主要思想是在不破坏封装性的前提下,保存对象的内部状态,从而可以在不影响对象本身的情况下,实现对象状态的保存、恢复、历史记录等功能。备忘录模式主要分为三个角色:发起人(Originator)、备忘录(Memento)和负责人(Caretaker)。

备忘录模式的使用场景

备忘录模式通常应用于需要实现对象状态的历史记录、撤销功能等领域,例如文本编辑器的历史记录功能、游戏中的存档系统等。

备忘录模式的代码示例

// 定义备忘录类
class Memento {
    private String state; // 用于保存状态信息

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

    public String getState() {
        return state;
    }
}

// 定义发起人类
class Originator {
    private String state;

    // 保存状态
    public void setState(String state) {
        this.state = state;
    }

    // 加载状态
    public String getState() {
        return state;
    }

    // 创建备忘录
    public Memento createMemento() {
        return new Memento(state);
    }

    // 恢复备忘录
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
}

// 定义负责人类
class Caretaker {
    private List<Memento> mementoList = new ArrayList<Memento>(); // 用于保存备忘录的列表

    // 添加备忘录
    public void add(Memento state) {
        mementoList.add(state);
    }

    // 获取备忘录
    public Memento get(int index) {
        return mementoList.get(index);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建发起人
        Originator originator = new Originator();
        // 创建负责人
        Caretaker caretaker = new Caretaker();

        // 设置发起人初始状态
        originator.setState("状态1");
        // 保存当前状态
        caretaker.add(originator.createMemento());

        // 更新状态
        originator.setState("状态2");
        // 保存当前状态
        caretaker.add(originator.createMemento());

        // 更新状态
        originator.setState("状态3");
        // 保存当前状态
        caretaker.add(originator.createMemento());

        // 恢复状态
        originator.restoreMemento(caretaker.get(0));
        System.out.println("恢复后的状态:" + originator.getState());

        // 恢复状态
        originator.restoreMemento(caretaker.get(1));
        System.out.println("恢复后的状态:" + originator.getState());

        // 恢复状态
        originator.restoreMemento(caretaker.get(2));
        System.out.println("恢复后的状态:" + originator.getState());
    }
}

以上是一个基本的备忘录设计模式的代码示例,其中 Memento 类负责保存发起人 Originator 的状态;Originator 负责创建备忘录和恢复状态;Caretaker 负责保存和获取备忘录。

在客户端代码中,我们通过频繁修改 Originator 对象的状态,然后通过 createMemento 方法保存状态,并将备忘录对象添加到 Caretaker 中,这样就可以实现备忘录模式。最后,我们通过恢复操作将状态恢复到备忘录中所保存的状态。

以上代码的结果为:

恢复后的状态:状态1
恢复后的状态:状态2
恢复后的状态:状态3

可以看到,我们将 Originator 对象的状态从 “状态1” 到 “状态2” 再到 “状态3” 进行了多次修改,并将每次的状态保存到备忘录中。在恢复状态时,我们从 Caretaker 中获取备忘录对象,并调用 Originator 的 restoreMemento 方法将状态恢复到对应备忘录中所保存的状态。

因此,客户端运行结果按顺序输出了三个状态的恢复结果,分别为 “状态1”、“状态2” 和 “状态3”。

这个示例虽然简单,但是比较清晰地展示了备忘录模式的核心思想。备忘录模式适用于保存对象历史记录、提供恢复数据的场合,具有很好的扩展性和灵活性,是一个很好的设计模式。

备忘录模式的实际应用

  1. Java中的UndoManager:Java中的UndoManager类是用来管理撤销、恢复操作的类,实现了备忘录模式,它利用了栈来保存Commands操作,利用了备忘录模式中的保存历史状态等功能。

  2. Android中的onSaveInstanceState/onRestoreInstanceState:在Android平台中,通过实现 onSaveInstanceState/onRestoreInstanceState 方法,可以保存和恢复Activity的状态信息,并且随时取出相关数据。这个功能也是基于备忘录模式实现的。

总结

备忘录模式是一种用于实现对象状态保存和恢复的设计模式,它可以在不破坏对象封装性的前提下,将对象状态保存到备忘录对象中。备忘录模式适用于需要实现对象历史记录、撤销操作等功能的场景。该模式的核心是备忘录类,用于保存对象状态;发起人类则是保存和恢复状态的对象;负责人类则是负责管理备忘录对象。备忘录模式具有很好的扩展性,可以通过继承和实现接口来增加功能,同时也可以与其他模式进行结合使用。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小虎哥的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值