设计模式之备忘录模式

        备忘录模式是一种行为型设计模式,它用于捕获一个对象的内部状态,并将其保存在一个外部对象中,以便在以后能够将对象恢复到先前的状态。备忘录模式允许在不暴露对象的内部结构的情况下,保存和还原对象的状态。

备忘录模式的主要参与者包括:

  1. 原发器(Originator): 原发器是需要保存状态的对象。它会创建备忘录对象来存储当前状态,或者从备忘录对象中还原状态。

  2. 备忘录(Memento): 备忘录是一个包含原发器状态快照的对象。备忘录通常具有访问原发器状态的方法,但它应该限制对状态的修改。

  3. 负责人(Caretaker): 负责人是一个对象,它负责存储备忘录对象,通常会维护一个备忘录对象的历史记录。负责人允许原发器从不同的备忘录对象中恢复状态。

备忘录模式的应用场景包括:

  • 撤销功能: 备忘录模式常用于实现撤销操作,允许用户取消之前的操作并恢复到先前的状态。

  • 版本控制系统: 版本控制系统如Git使用备忘录模式来记录代码库的不同版本,以便可以随时还原到先前的代码状态。

  • 游戏进度保存: 在游戏开发中,备忘录模式可用于保存游戏的当前状态,以便玩家可以随时恢复到先前的游戏状态。

  • 文档编辑器: 文档编辑器可以使用备忘录模式来存储文档的历史版本,以便用户可以查看和还原以前的文档状态。

下面是一个简单的备忘录模式示例:

// 备忘录对象,存储文本编辑器的状态
class TextEditorMemento {
    private final String text;

    public TextEditorMemento(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

// 原发器对象,即文本编辑器
class TextEditor {
    private String text;

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    // 创建备忘录,保存当前状态
    public TextEditorMemento createMemento() {
        return new TextEditorMemento(text);
    }

    // 从备忘录中恢复状态
    public void restoreMemento(TextEditorMemento memento) {
        text = memento.getText();
    }
}

// 负责人对象,负责存储备忘录对象
class TextEditorHistory {
    private Stack<TextEditorMemento> history = new Stack<>();

    // 将备忘录对象存储到历史记录中
    public void save(TextEditorMemento memento) {
        history.push(memento);
    }

    // 从历史记录中获取最近的备忘录对象
    public TextEditorMemento getLastSaved() {
        if (!history.isEmpty()) {
            return history.pop();
        }
        return null;
    }
}

public class Client {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        TextEditorHistory history = new TextEditorHistory();

        // 编辑文本并保存状态
        textEditor.setText("This is the initial text.");
        history.save(textEditor.createMemento());

        textEditor.setText("Modified text.");
        history.save(textEditor.createMemento());

        // 恢复到先前的状态
        TextEditorMemento previousState = history.getLastSaved();
        if (previousState != null) {
            textEditor.restoreMemento(previousState);
            System.out.println("Restored to previous state: " + textEditor.getText());
        } else {
            System.out.println("No previous state found.");
        }
    }
}

运行结果:

        在这个示例中,我们创建了一个文本编辑器对象(原发器),并使用备忘录模式来保存文本编辑器的状态。用户可以编辑文本,然后通过撤销操作恢复到以前的状态。负责人对象维护了历史记录,以便能够获取最近保存的状态。

        备忘录模式使得文本编辑器能够实现撤销功能,同时不需要暴露其内部状态的细节,从而增强了可维护性和用户体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鲤鱼程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值