备忘录模式:轻松实现状态恢复

备忘录模式的核心概念

备忘录模式(Memento Pattern)是一种行为设计模式,允许在不暴露对象内部状态细节的情况下捕获并恢复对象的先前状态。该模式通过三个核心角色实现:

  • Originator(发起人):需要保存状态的对象,负责创建备忘录并恢复状态。
  • Memento(备忘录):存储发起人对象的内部状态,通常设计为不可变对象。
  • Caretaker(管理者):负责保存和管理备忘录,但不能修改其内容。

应用场景与优势

备忘录模式适用于以下场景:

  • 需要实现撤销(Undo)或回滚(Rollback)功能的应用,如文本编辑器、游戏存档。
  • 需要保存对象状态的快照,同时避免破坏封装性。

优势包括:

  • 状态隔离:备忘录将状态存储与业务逻辑分离,降低耦合。
  • 可扩展性:支持多次撤销或状态历史管理。

实现步骤

1. 定义备忘录类
备忘录类应仅暴露必要的接口给发起人,对外隐藏状态细节。

public class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

2. 实现发起人类
发起人通过备忘录保存和恢复自身状态。

public class Originator {
    private String state;

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

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

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

3. 管理者类
管理者负责存储备忘录栈(或其他数据结构),支持撤销操作。

import java.util.Stack;

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

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

    public Memento getMemento() {
        return mementoStack.pop();
    }
}

实际案例:文本编辑器撤销功能

以下是一个简化版文本编辑器的实现:

public class TextEditor {
    private StringBuilder content = new StringBuilder();

    public void write(String text) {
        content.append(text);
    }

    public Memento save() {
        return new Memento(content.toString());
    }

    public void restore(Memento memento) {
        content = new StringBuilder(memento.getState());
    }

    public String getContent() {
        return content.toString();
    }
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        editor.write("First line.");
        caretaker.saveMemento(editor.save());

        editor.write(" Second line.");
        System.out.println(editor.getContent()); // 输出: "First line. Second line."

        editor.restore(caretaker.getMemento());
        System.out.println(editor.getContent()); // 输出: "First line."
    }
}

注意事项

  • 性能考虑:频繁保存大对象状态可能导致内存消耗过高,可通过增量备份或序列化优化。
  • 线程安全:多线程环境下需确保备忘录的创建和恢复操作原子性。
  • 深度拷贝:若状态包含引用类型,需确保备忘录保存的是深拷贝而非浅拷贝。

与其他模式的关系

  • 命令模式:常与备忘录模式结合,实现命令的撤销/重做。
  • 原型模式:可通过克隆快速生成状态副本,替代显式备忘录类。

备忘录模式通过状态封装与历史管理,为复杂系统提供了灵活的状态恢复机制,是设计模式中处理对象状态问题的经典解决方案。

BbS.okacop092.info/PoSt/1120_703804.HtM
BbS.okacop093.info/PoSt/1120_115597.HtM
BbS.okacop094.info/PoSt/1120_479453.HtM
BbS.okacop095.info/PoSt/1120_772443.HtM
BbS.okacop096.info/PoSt/1120_650527.HtM
BbS.okacop097.info/PoSt/1120_341619.HtM
BbS.okacop098.info/PoSt/1120_185065.HtM
BbS.okacop099.info/PoSt/1120_424950.HtM
BbS.okacop114.info/PoSt/1120_928741.HtM
BbS.okacop829.info/PoSt/1120_253092.HtM
BbS.okacop092.info/PoSt/1120_433280.HtM
BbS.okacop093.info/PoSt/1120_846443.HtM
BbS.okacop094.info/PoSt/1120_809209.HtM
BbS.okacop095.info/PoSt/1120_556994.HtM
BbS.okacop096.info/PoSt/1120_119809.HtM
BbS.okacop097.info/PoSt/1120_788266.HtM
BbS.okacop098.info/PoSt/1120_265642.HtM
BbS.okacop099.info/PoSt/1120_683889.HtM
BbS.okacop114.info/PoSt/1120_820371.HtM
BbS.okacop829.info/PoSt/1120_723136.HtM
BbS.okacop092.info/PoSt/1120_813793.HtM
BbS.okacop093.info/PoSt/1120_470763.HtM
BbS.okacop094.info/PoSt/1120_529586.HtM
BbS.okacop095.info/PoSt/1120_530207.HtM
BbS.okacop096.info/PoSt/1120_235489.HtM
BbS.okacop097.info/PoSt/1120_445587.HtM
BbS.okacop098.info/PoSt/1120_939427.HtM
BbS.okacop099.info/PoSt/1120_127344.HtM
BbS.okacop114.info/PoSt/1120_306150.HtM
BbS.okacop829.info/PoSt/1120_291013.HtM
BbS.okacop092.info/PoSt/1120_588690.HtM
BbS.okacop093.info/PoSt/1120_692235.HtM
BbS.okacop094.info/PoSt/1120_672814.HtM
BbS.okacop095.info/PoSt/1120_204396.HtM
BbS.okacop096.info/PoSt/1120_392421.HtM
BbS.okacop097.info/PoSt/1120_198205.HtM
BbS.okacop098.info/PoSt/1120_598633.HtM
BbS.okacop099.info/PoSt/1120_615397.HtM
BbS.okacop114.info/PoSt/1120_992180.HtM
BbS.okacop829.info/PoSt/1120_764815.HtM
BbS.okacop092.info/PoSt/1120_513830.HtM
BbS.okacop093.info/PoSt/1120_640018.HtM
BbS.okacop094.info/PoSt/1120_428088.HtM
BbS.okacop095.info/PoSt/1120_277601.HtM
BbS.okacop096.info/PoSt/1120_621038.HtM
BbS.okacop097.info/PoSt/1120_443150.HtM
BbS.okacop098.info/PoSt/1120_462178.HtM
BbS.okacop099.info/PoSt/1120_381288.HtM
BbS.okacop114.info/PoSt/1120_999902.HtM
BbS.okacop829.info/PoSt/1120_384248.HtM
BbS.okacop000.info/PoSt/1120_387225.HtM
BbS.okacop001.info/PoSt/1120_376656.HtM
BbS.okacop002.info/PoSt/1120_565801.HtM
BbS.okacop003.info/PoSt/1120_996900.HtM
BbS.okacop004.info/PoSt/1120_597849.HtM
BbS.okacop005.info/PoSt/1120_204370.HtM
BbS.okacop006.info/PoSt/1120_602464.HtM
BbS.okacop007.info/PoSt/1120_639512.HtM
BbS.okacop008.info/PoSt/1120_065759.HtM
BbS.okacop009.info/PoSt/1120_380207.HtM
BbS.okacop000.info/PoSt/1120_162263.HtM
BbS.okacop001.info/PoSt/1120_717139.HtM
BbS.okacop002.info/PoSt/1120_429882.HtM
BbS.okacop003.info/PoSt/1120_165292.HtM
BbS.okacop004.info/PoSt/1120_225471.HtM
BbS.okacop005.info/PoSt/1120_219146.HtM
BbS.okacop006.info/PoSt/1120_633209.HtM
BbS.okacop007.info/PoSt/1120_362112.HtM
BbS.okacop008.info/PoSt/1120_521236.HtM
BbS.okacop009.info/PoSt/1120_641738.HtM
BbS.okacop000.info/PoSt/1120_804849.HtM
BbS.okacop001.info/PoSt/1120_422727.HtM
BbS.okacop002.info/PoSt/1120_098904.HtM
BbS.okacop003.info/PoSt/1120_083865.HtM
BbS.okacop004.info/PoSt/1120_612286.HtM
BbS.okacop005.info/PoSt/1120_627869.HtM
BbS.okacop006.info/PoSt/1120_898481.HtM
BbS.okacop007.info/PoSt/1120_156074.HtM
BbS.okacop008.info/PoSt/1120_519447.HtM
BbS.okacop009.info/PoSt/1120_816568.HtM

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务