备忘录模式的学习与使用

1、备忘录模式的学习

  当您需要在不破坏封装性的前提下保存和恢复对象的状态时,备忘录模式是一种有用的设计模式。备忘录模式允许您将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态。这种模式分离了状态的保存和恢复逻辑,使得对象的状态管理更加灵活和可扩展
  备忘录模式包含以下几个关键角色:

  • Originator(原发器):原发器是要保存和恢复状态的对象。它可以创建备忘录对象来保存其内部状态,并从备忘录对象中恢复状态。
  • Memento(备忘录):备忘录通常具有与原发器相对应的属性,并可以通过原发器访问其内部状态。
  • Caretaker(负责人):负责人对象负责保存和管理备忘录对象。它可以将备忘录传递给原发器以进行状态的恢复,或者将备忘录存档以供以后使用。

  备忘录模式的工作流程如下:

  1. 原发器创建一个备忘录对象,并将自己的状态存储在备忘录中。
  2. 原发器可以使用备忘录对象来保存其内部状态。
  3. 在需要时,原发器可以从备忘录中恢复其状态。
  4. 负责人对象可以保存多个备忘录对象,并负责管理它们的存储和恢复。
    在这里插入图片描述

2、备忘录模式的使用

  假设你正在开发一个文本编辑器应用程序。你需要实现一个撤销(undo)功能,使用户能够撤销对文本的修改操作。你可以使用备忘录模式来实现这个功能。
备忘录

public class TextMemento {

    private String value;

    public TextMemento(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

原发器

public class TextOriginator {
    private TextMemento textMemento;

    public void setTextMemento(String value) {
        if (Objects.isNull(textMemento)) {
            this.textMemento = new TextMemento(value);
        } else {
            this.textMemento.setValue(value);
        }
    }

    public void restoreTextMemento(TextMemento textMemento) {
        this.textMemento.setValue(textMemento.getValue());
    }

    public TextMemento createTextMemento() {
        return new TextMemento(this.textMemento.getValue());
    }

    public TextMemento getTextMento() {
        return textMemento;
    }
}

负责人

public class TextCaretaker {
    private List<TextMemento> textMementoList = new ArrayList<>();

    public Integer addTextMemento(TextMemento textMemento) {
        textMementoList.add(textMemento);
        return textMementoList.size();
    }

    public TextMemento getTextMento(int index) {
        if (index < textMementoList.size()) {
            return textMementoList.get(index);
        }
        return null;
    }
}

客户端

public class TextMementoClient {

    public static void main(String[] args) {

        TextCaretaker textCaretaker = new TextCaretaker();

        TextOriginator textOriginator = new TextOriginator();
        textOriginator.setTextMemento("状态1");

        textCaretaker.addTextMemento(textOriginator.createTextMemento());

        textOriginator.setTextMemento("状态2");
        textCaretaker.addTextMemento(textOriginator.createTextMemento());

        textOriginator.setTextMemento("状态3");
        textCaretaker.addTextMemento(textOriginator.createTextMemento());

        System.out.println(textOriginator.getTextMento().getValue());
        textOriginator.restoreTextMemento(textCaretaker.getTextMento(0));
        System.out.println(textOriginator.getTextMento().getValue());
    }
}
状态3
状态1

3、总结

备忘录模式的优点包括:

  • 它可以保存和恢复对象的状态,而无需破坏其封装性。
  • 它可以简化原发器的代码,将状态管理交给负责人对象。
  • 它提供了灵活性,使得可以随时保存和恢复对象的不同状态。

然而,备忘录模式也有一些注意事项:

  • 备忘录对象可能会消耗较大的内存,特别是在保存大量状态时。
  • 备忘录对象通常只由原发器访问,因此其他对象无法直接访问或修改备忘录中的状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值