目录
一、什么是备忘录模式
想象一下,你正在玩一款紧张刺激的角色扮演游戏。你操控的角色在游戏世界中不断冒险,积累经验、获取装备,一步步变得强大。在游戏过程中,你来到了一个关键的关卡,这里的怪物非常强大,战斗异常艰难。你担心自己在战斗中失败,导致之前辛苦积累的进度白费,于是你点击了游戏中的 “存档” 按钮。游戏系统将你当前的角色状态,包括等级、生命值、魔法值、装备情况以及所处位置等信息,都记录了下来。
后来,你在战斗中果然不幸失败了。不过没关系,你可以选择读取之前保存的存档,游戏就会将你的角色状态恢复到存档时的样子,你可以重新挑战这个关卡。这,其实就是备忘录模式在生活中的一个生动体现。
从专业角度来讲,备忘录模式(Memento Pattern)是一种行为型设计模式 ,其定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。在这个模式中,有三个主要角色:
-
原发器(Originator):需要保存状态的对象,它负责创建备忘录来保存自身的状态,同时也能使用备忘录恢复自己的状态。就像游戏中的角色,它知道自己的各种状态信息,并且能够创建一个存档(备忘录)来记录这些状态,在需要时还能从存档中恢复自己的状态。
-
备忘录(Memento):由原发器创建,用于保存原发器的状态。它就像是游戏中的存档文件,里面记录了角色在某个特定时刻的所有状态信息。
-
负责人(Caretaker):负责存储备忘录,但不直接操作备忘录的内容,只是在原发器需要时提供备忘录。可以把它看作是游戏的存档管理系统,负责保存和提供存档,但不会去修改存档里面的内容。
二、备忘录模式的结构与角色
2.1 发起人(Originator)
发起人是备忘录模式中的核心角色之一,它就像是一个故事的主角,所有关于状态的记录和恢复都围绕着它展开。在前面提到的游戏例子中,游戏角色就是发起人。它拥有一系列的属性和行为,这些属性构成了它的状态,比如生命值、魔法值、等级、装备等 。
发起人负责创建备忘录,在创建备忘录时,它会将自己当前的状态信息封装到备忘录对象中。就好比游戏角色在存档时,会把自己当时的所有状态信息都写入到存档文件(备忘录)中。同时,发起人还具备使用备忘录恢复自身状态的能力。当游戏角色在战斗中失败需要重新读取存档时,它就会从备忘录中获取之前保存的状态信息,将自己恢复到存档时的状态。在代码实现中,发起人通常会有一个创建备忘录的方法,以及一个从备忘录中恢复状态的方法。例如:
// 发起人 - 游戏角色
class GameCharacter {
private int health;
private int magic;
private int level;
private String equipment;
// 设置角色状态
public void setState(int health, int magic, int level, String equipment) {
this.health = health;
this.magic = magic;
this.level = level;
this.equipment = equipment;
}
// 创建备忘录
public Memento createMemento() {
return new Memento(health, magic, level, equipment);
}
// 从备忘录恢复状态
public void restoreFromMemento(Memento memento) {
this.health = memento.getHealth();
this.magic = memento.getMagic();
this.level = memento.getLevel();
this.equipment = memento.getEquipment();
}
}
2.2 备忘录(Memento)
备忘录是一个非常重要的角色,它就像是一个时间胶囊,专门用来存储发起人在某个特定时刻的内部状态。还是以游戏为例,备忘录就是游戏中的存档文件,里面详细记录了游戏角色在存档那一刻的所有状态信息,包括生命值、魔法值、等级、装备等。
为了保证状态的完整性和安全性,备忘录通常会限制外部对象对其内部状态的访问。只有发起人能够直接访问备忘录中的所有状态信息,其他对象只能通过特定的接口(如果有的话)进行有限的访问 。在代码实现中,备忘录类通常会包含与发起人状态相关的属性,以及一些用于获取这些属性的方法(可能对发起人公开,对其他对象限制)。例如:
// 备忘录 - 游戏存档
class Memento {
private int health;
private int magic;
private int level;
private String equipment;
public Memento(int healt