【玩转23种Java设计模式】行为型模式篇:备忘录模式

发布于:2025-02-11 ⋅ 阅读:(33) ⋅ 点赞:(0)

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

一、简介

  备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的状态,以便在未来可以恢复到之前的某个状态。该模式避免了直接暴露对象的内部状态,从而实现了数据的封装性。

主要角色:

  • Originator(发起人):创建并存储自身状态到备忘录中,可以从备忘录中恢复状态。
  • Memento(备忘录):存储发起人的状态,提供给发起人恢复状态的接口。
  • Caretaker(管理者):负责保存和管理备忘录,但不能操作备忘录内容。

二、实例

例如:模拟文本编辑器中“撤销”操作的实现。

1、文本编辑器(TextEditor)

class TextEditor {
    private String text;

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

    public String getText() {
        return text;
    }

    // 创建备忘录
    public Memento save() {
        return new Memento(text);
    }

    // 从备忘录恢复状态
    public void restore(Memento memento) {
        this.text = memento.getText();
    }

    // Memento:备忘录内部类
    static class Memento {
        private final String text;

        private Memento(String text) {
            this.text = text;
        }

        private String getText() {
            return text;
        }
    }
}

2、管理者(Caretaker)

class Caretaker {
    private final List<TextEditor.Memento> mementoList = new ArrayList<>();

    public void addMemento(TextEditor.Memento memento) {
        mementoList.add(memento);
    }

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

3、客户端(MementoPatternExample)

public class MementoPatternExample {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        // 初始状态
        editor.setText("Hello");
        System.out.println("Initial Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 修改状态1
        editor.setText("Hello, World");
        System.out.println("Updated Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 修改状态2
        editor.setText("Hello, Design Patterns");
        System.out.println("Updated Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 撤销操作
        editor.restore(caretaker.getMemento(1));
        System.out.println("After Undo: " + editor.getText());

        // 再次撤销
        editor.restore(caretaker.getMemento(0));
        System.out.println("After Second Undo: " + editor.getText());
    }
}

三、总结

1、优点

  • 封装性好:发起人和备忘录内部状态的实现细节对外界透明,保证了对象的封装性。
  • 状态恢复:可以轻松保存和恢复对象的状态,适合需要频繁回退操作的场景。
  • 灵活性高:支持保存多个状态,提供多种恢复方式。

2、缺点

  • 资源消耗大:如果状态对象较大或需要保存的状态很多,可能会消耗较多内存。
  • 管理复杂:需要一个管理机制来保存和恢复状态,增加了系统复杂性。

3、应用场景

  • 撤销和重做功能:如文本编辑器、图形编辑器。
  • 游戏存档:在游戏中保存和恢复玩家的进度。
  • 事务性操作:在操作失败时可以回滚到之前的状态。
  • 状态恢复:适用于需要频繁切换对象状态的场景。

网站公告

今日签到

点亮在社区的每一天
去签到