备忘录模式详解:实现对象状态的保存与恢复

备忘录模式(Memento Pattern)是一种行为设计模式,允许在不破坏封装的情况下捕获和恢复对象的内部状态。它主要用于实现撤销操作。

在软件开发中,有时需要记录对象的内部状态,以便在需要时恢复到某个先前的状态。例如,文本编辑器的撤销功能就是一个典型的应用场景。备忘录模式通过将对象的状态保存在备忘录对象中,从而实现状态的保存和恢复。

一,备忘录模式的结构

备忘录模式涉及三个主要角色:

  1. Originator(发起人):创建一个包含其当前内部状态的备忘录,并使用备忘录恢复其内部状态。
  2. Memento(备忘录):存储发起人的内部状态,并防止其他对象访问备忘录。备忘录有两个接口:一个是提供给发起人以外的对象的窄接口,另一个是仅提供给发起人的宽接口。
  3. Caretaker(管理者):负责保存备忘录,但不能对备忘录的内容进行操作或检查。

uml类图:
在这里插入图片描述

二,备忘录模式的实现

以下是一个简单的备忘录模式实现示例:

// Memento class
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

// Originator class
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

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

    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// Caretaker class
import java.util.ArrayList;
import java.util.List;

public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}

// Demo class
public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State #1");
        originator.setState("State #2");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #3");
        caretaker.add(originator.saveStateToMemento());

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

        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        originator.getStateFromMemento(caretaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}

三,备忘录模式的优缺点

优点

  • 封装性好: 备忘录模式保存和恢复对象的状态时,不需要暴露对象的内部细节。
  • 简化撤销操作: 可以很容易地实现对象状态的保存和恢复,简化了撤销操作的实现。

缺点

  • 资源消耗大: 如果需要频繁保存和恢复对象的状态,可能会占用大量的内存资源。
  • 实现复杂: 对于复杂对象的状态保存和恢复,可能需要额外的工作来管理备忘录。

四,备忘录模式的适用场景

需要保存和恢复对象的状态时。
需要实现撤销操作时。
需要避免暴露对象的内部状态和实现细节时。

五,总结

备忘录模式通过将对象的状态保存在备忘录对象中,从而实现状态的保存和恢复。它在不破坏封装的前提下,提供了一种简洁的方式来实现撤销操作,但也需要注意资源消耗和实现复杂度的问题。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

技术拾光者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值