行为型-备忘录模式(Memento Pattern)

说明

备忘录模式是一种行为型设计模式,通过捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色:。

  1. 发起人(Originator):负责创建一个备忘录,并记录当前对象的内部状态到备忘录中。
  2. 备忘录(Memento):负责存储发起人对象的内部状态,提供给发起人对象恢复内部状态的方法。
  3. 负责人(Caretaker):负责保存备忘录,可以使用备忘录来回滚对象的状态。

备忘录模式的核心思想是将对象的状态保存在一个独立的对象中,以便以后恢复。通过使用备忘录模式,我们可以轻松地实现对象状态的保存和恢复,同时也提高了系统的可维护性和扩展性。

优点
  • 它提供了一种可以在不破坏封装性的情况下恢复对象状态的方法。
  • 它简化了发起人对象的设计,避免了复杂的状态管理。
  • 它可以在不影响客户端的情况下实现对象的历史记录和撤销操作。
缺点
  • 需要消耗一定的内存空间来存储备忘录对象。
  • 如果发起人对象的状态非常庞大,那么备忘录对象的存储和恢复操作可能会很昂贵。
使用场景
  • 需要保存和恢复对象状态的场景,例如游戏中的存档功能、文档编辑器的撤销和恢复功能等。
  • 需要提供对象的历史记录和撤销功能的场景,例如文本编辑器中的编辑历史记录、Web浏览器中的前进和后退功能等。

示例

下面以一个游戏存档的例子来说明备忘录模式的实现。

首先,我们定义游戏类Game,其中包含当前游戏的状态信息和对状态进行修改和恢复的方法:

java 复制代码
public class Game {
    private String level;
    private int score;

    public Game(String level, int score) {
        this.level = level;
        this.score = score;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public void printStatus() {
        System.out.println("当前游戏状态:level=" + level + ", score=" + score);
    }

    // 创建备忘录
    public Memento createMemento() {
        return new Memento(level, score);
    }

    // 从备忘录中恢复状态
    public void restoreMemento(Memento memento) {
        this.level = memento.getLevel();
        this.score = memento.getScore();
    }
}

然后,我们定义备忘录类Memento,用于存储游戏状态:

java 复制代码
public class Memento {
    private String level;
    private int score;

    public Memento(String level, int score) {
        this.level = level;
        this.score = score;
    }

    public String getLevel() {
        return level;
    }

    public int getScore() {
        return score;
    }
}

最后,我们定义管理者类Caretaker,用于保存游戏状态的备忘录,并支持回溯和恢复操作:

java 复制代码
import java.util.Stack;

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

    // 保存当前状态
    public void save(Game game) {
        mementoStack.push(game.createMemento());
    }

    // 回溯到上一个状态
    public void undo(Game game) {
        if (!mementoStack.isEmpty()) {
            game.restoreMemento(mementoStack.pop());
        }
    }

    // 恢复到最初状态
    public void reset(Game game) {
        mementoStack.clear();
        game.setLevel("简单");
        game.setScore(0);
    }
}

现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:

java 复制代码
public class MementoExample {
    public static void main(String[] args) {
        // 创建游戏对象
        Game game = new Game("简单", 0);

        // 创建管理者对象
        Caretaker caretaker = new Caretaker();

        // 保存当前状态
        caretaker.save(game);

        // 改变游戏状态
        game.setLevel("普通");
        game.setScore(100);

        // 保存当前状态
        caretaker.save(game);

        // 改变游戏状态
        game.setLevel("困难");
        game.setScore(200);

        // 保存当前状态
        caretaker.save(game);

        // 回溯到上一个状态
        caretaker.undo(game);
        game.printStatus(); // 当前游戏状态:level=普通, score=100

        // 回溯到最初状态
        caretaker.reset(game);
        game.printStatus(); // 当前游戏状态:level=简单, score=0
    }
}

现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:

当前游戏状态:level=普通, score=100

当前游戏状态:level=简单, score=0

相关推荐
GodKeyNet1 小时前
设计模式-责任链模式
java·设计模式·责任链模式
摘星编程6 小时前
深入理解责任链模式:从HTTP中间件到异常处理的实战应用
http·设计模式·中间件·责任链模式·实战应用
鼠鼠我呀28 小时前
【设计模式04】单例模式
单例模式·设计模式
缘来是庄16 小时前
设计模式之访问者模式
java·设计模式·访问者模式
hqxstudying19 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
花好月圆春祺夏安20 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
fie888920 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
哆啦A梦的口袋呀20 小时前
《深入设计模式》模式结构汇总
设计模式
花好月圆春祺夏安20 小时前
基于odoo17的设计模式详解---单例模式
单例模式·设计模式
在未来等你1 天前
设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
设计模式·模板方法模式·软件架构·java开发·面向对象设计·设计模式实战·java应用开发