备忘录模式具体的例子(含代码)

学习目标:

  • 了解备忘录模式

学习内容:

备忘录模式在现实生活中的一个具体例子是文字处理软件(如Microsoft Word)中的“撤销”功能。这个功能允许用户在编辑文档时撤销之前的操作,并恢复到之前的状态。让我们更详细地看一下如何用备忘录模式实现这个功能。

文字处理软件中的“撤销”功能

假设你在使用文字处理软件编写一篇文章。你可能会进行多次编辑操作,例如添加文本、删除文本和修改格式。软件会在每次操作后保存文档的当前状态,使你能够撤销任何不需要的操作,并恢复到之前的状态。

备忘录模式的应用

发起人(Originator):代表文档对象。它可以创建一个备忘录对象来保存当前文档的状态,并可以从备忘录对象恢复到之前的状态。
备忘录(Memento):存储文档的状态,例如文本内容和格式。
负责人(Caretaker):管理备忘录对象的列表,以便可以保存和恢复文档的状态。

代码实现

// 备忘录类
public class Memento {
    private String content;

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

    public String getContent() {
        return content;
    }
}

// 发起人类
public class Document {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public Memento saveToMemento() {
        return new Memento(content);
    }

    public void restoreFromMemento(Memento memento) {
        content = memento.getContent();
    }
}

// 负责人类
import java.util.Stack;

public class Caretaker {
    private Stack<Memento> mementoStack = new Stack<>();

    public void saveMemento(Memento memento) {
        mementoStack.push(memento);
    }

    public Memento undo() {
        if (!mementoStack.isEmpty()) {
            return mementoStack.pop();
        }
        return null;
    }
}

// 客户端代码
public class TextEditor {
    public static void main(String[] args) {
        Document document = new Document();
        Caretaker caretaker = new Caretaker();

        // 初始内容
        document.setContent("First version");
        System.out.println("Content: " + document.getContent());

        // 保存状态
        caretaker.saveMemento(document.saveToMemento());

        // 修改内容
        document.setContent("Second version");
        System.out.println("Content: " + document.getContent());

        // 保存状态
        caretaker.saveMemento(document.saveToMemento());

        // 进一步修改内容
        document.setContent("Third version");
        System.out.println("Content: " + document.getContent());

        // 执行撤销操作
        document.restoreFromMemento(caretaker.undo());
        System.out.println("After undo: " + document.getContent());

        // 再次执行撤销操作
        document.restoreFromMemento(caretaker.undo());
        System.out.println("After second undo: " + document.getContent());
    }
}

解释

  • 备忘录类(Memento):存储文档的状态,这里是文档的内容。
  • 发起人类(Document):负责创建备忘录对象以保存当前状态,并从备忘录对象中恢复状态。
  • 负责人类(Caretaker):管理保存的备忘录对象,提供撤销功能。

在这个例子中,用户可以进行多次编辑,每次编辑后保存当前状态到备忘录中。如果用户需要撤销某个编辑操作,只需从负责人(Caretaker)中获取之前保存的状态,并恢复到该状态。这样,文档对象就能够恢复到之前的状态,实现了撤销功能。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java 猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值