绝绝子!Java 备忘录模式高级玩法大赏

95 阅读4分钟

宝子们,今天咱来唠唠 Java 里超厉害的备忘录模式,这玩意儿就像是给对象的状态偷偷拍个照,存起来以备不时之需,关键时刻能让对象 “穿越回过去”,是不是很神奇?

一、备忘录模式是啥东东

简单来说,当我们需要保存一个对象的某个状态,以便之后恢复这个状态时,备忘录模式就闪亮登场啦。它有三个关键角色:

  • 原发器(Originator) :就是那个拥有内部状态,并且能创建备忘录和从备忘录中恢复状态的对象,好比一个有故事的人,能记录自己的过往,也能回忆往昔。
  • 备忘录(Memento) :负责存储原发器的内部状态,相当于一个时光胶囊,把那些重要的状态数据都封存在里面,不让外人随便改动,保证数据的纯净性。
  • 负责人(Caretaker) :看管备忘录的小管家,它负责保存备忘录,但不修改备忘录的内容,只在原发器需要的时候把备忘录交出去,是不是很靠谱?

二、高级使用场景

  1. 游戏存档:咱玩游戏的时候,辛辛苦苦打怪升级,这时候来个存档功能就很奈斯。游戏角色(原发器)的各种属性(状态),比如等级、装备、金币数量等,都可以被保存在备忘录里,下次想从这个存档点继续玩(恢复状态),就能轻松实现,妈妈再也不用担心我游戏进度丢失啦!

想象一下,你在一款大型角色扮演游戏中,经过数小时激战,终于打败了一个超级 BOSS,角色等级提升到了 50 级,还获得了一套顶级装备,此时游戏自动保存了这个状态(创建备忘录)。后来,你在探索一个新的高难度副本时,不小心陷入了困境,角色 “壮烈牺牲” 多次。这时候,你就可以从之前保存的备忘录中恢复角色状态(等级 50 级和顶级装备),重新挑战副本,是不是感觉像拥有了 “后悔药”?

  1. 文本编辑器的撤销操作:当你在文档里一顿操作猛如虎,结果发现改错了,这时候撤销功能就是备忘录模式的功劳。文本的每一次编辑状态(原发器状态)都被记录下来,你点一下撤销,就能回到之前的某个状态,就像时光倒流一样,简直是手残党福音。

比如说你正在写一篇论文,写了好几百字后,突然发现中间一段逻辑混乱,于是你开始疯狂删减和修改。结果改着改着,发现把前面一些重要的观点也改错了,这时候你只需要按下撤销快捷键(Ctrl + Z),文本编辑器就能从备忘录中获取之前的状态,一步一步恢复到你想要的版本,让你避免了重新输入的麻烦。

三、代码示例走起

// 备忘录类,存储原发器的状态
class Memento {
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}
// 原发器类
class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    // 创建备忘录
    public Memento saveStateToMemento() {
        return new Memento(state);
    }
    // 从备忘录中恢复状态
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}
// 负责人类
class Caretaker {
    private Memento memento;
    public void saveMemento(Memento memento) {
        this.memento = memento;
    }
    public Memento getMemento() {
        return memento;
    }
}
// 测试一下
public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        // 初始状态
        originator.setState("初始状态,等级 1,金币 0");
        System.out.println("初始状态:" + originator.getState());
        // 保存状态
        caretaker.saveMemento(originator.saveStateToMemento());
        // 状态更新
        originator.setState("升级啦,等级 2,金币 100");
        System.out.println("更新后状态:" + originator.getState());
        // 恢复状态
        originator.getStateFromMemento(caretaker.getMemento());
        System.out.println("恢复后状态:" + originator.getState());
        // 再来一次复杂点的操作
        originator.setState("又升级啦,等级 3,金币 200,获得新技能");
        System.out.println("再次更新后状态:" + originator.getState());
        caretaker.saveMemento(originator.saveStateToMemento());
        originator.setState("挑战失败,掉血掉装备,等级 2,金币 150");
        System.out.println("挑战后状态:" + originator.getState());
        originator.getStateFromMemento(caretaker.getMemento());
        System.out.println("从第二次存档恢复后状态:" + originator.getState());
    }
}

宝子们,学会了备忘录模式,就等于掌握了 Java 世界里的一个时光魔法,赶紧在自己的代码里试试吧,说不定能解决好多头疼的问题呢!