类图: 备忘录设计模式类图
一.什么是备忘录设计模式?
备忘录设计模式(Memento Pattern)是一种行为型设计模式,用于在不暴露对象实现细节的前提下,捕获并保存对象在某一时刻的状态,以便之后可以将其恢复到之前的状态。该模式的主要目标是保存对象的状态并在需要时进行状态回滚。
二.备忘录模式的特点
- 封装状态:将对象的内部状态存储在备忘录中,并且不让外部访问这些状态细节。
- 提供撤销功能:支持撤销操作,特别适合需要恢复到之前状态的场景。
- 降低耦合:发起者(Originator)与管理备忘录的角色(Caretaker)解耦。
三.备忘录模式的结构
- Originator(发起者):负责创建备忘录并恢复自身状态。
- Memento(备忘录):存储发起者的状态。
- Caretaker(管理者):负责保存和恢复备忘录。
四.备忘录模式的优缺点
- 优点:
- 提供了一种状态恢复机制。
- 发起者的内部状态对外部透明。
- 缺点:
- 可能需要大量的存储空间,尤其是需要存储大量状态时。
- 如果对象状态过于复杂,可能会增加备忘录的维护成本。
五.备忘录模式的 C++ 实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 备忘录类
class Memento {
private:
string state;
public:
Memento(const string& s) : state(s) {}
string GetState() const { return state; }
};
// 发起者类
class Originator {
private:
string state;
public:
void SetState(const string& s) {
state = s;
cout << "Set state to: " << state << endl;
}
string GetState() const { return state; }
Memento* CreateMemento() const {
return new Memento(state);
}
void SetMemento(Memento* memento) {
state = memento->GetState();
cout << "Restored state to: " << state << endl;
}
};
// 管理者类
class Caretaker {
private:
vector<Memento*> mementos;
public:
void SaveMemento(Memento* memento) {
mementos.push_back(memento);
}
Memento* GetMemento(int index) const {
if (index >= 0 && index < mementos.size()) {
return mementos[index];
}
return nullptr;
}
~Caretaker() {
for (Memento* m : mementos) {
delete m;
}
}
};
int main() {
Originator originator;
Caretaker caretaker;
originator.SetState("State1");
caretaker.SaveMemento(originator.CreateMemento());
originator.SetState("State2");
caretaker.SaveMemento(originator.CreateMemento());
originator.SetState("State3");
// 恢复到之前的状态
originator.SetMemento(caretaker.GetMemento(0));
originator.SetMemento(caretaker.GetMemento(1));
return 0;
}
六.备忘录模式的 Java 实现
import java.util.ArrayList;
import java.util.List;
// 备忘录类
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;
System.out.println("Set state to: " + state);
}
public String getState() {
return state;
}
public Memento createMemento() {
return new Memento(state);
}
public void setMemento(Memento memento) {
this.state = memento.getState();
System.out.println("Restored state to: " + state);
}
}
// 管理者类
class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void saveMemento(Memento memento) {
mementos.add(memento);
}
public Memento getMemento(int index) {
if (index >= 0 && index < mementos.size()) {
return mementos.get(index);
}
return null;
}
}
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State1");
caretaker.saveMemento(originator.createMemento());
originator.setState("State2");
caretaker.saveMemento(originator.createMemento());
originator.setState("State3");
// 恢复到之前的状态
originator.setMemento(caretaker.getMemento(0));
originator.setMemento(caretaker.getMemento(1));
}
}
七.总结
备忘录设计模式适用于需要保存对象状态并提供恢复功能的场景,比如文本编辑器、游戏存档等。通过将状态封装到备忘录中,备忘录模式实现了状态的透明保存与恢复,从而提升了系统的可维护性和灵活性。
应用场景:
- 文本编辑器:保存编辑状态,支持撤销和恢复操作。
- 游戏存档:保存玩家的游戏进度,并允许玩家恢复到之前的状态。
- 事务管理:数据库事务可以利用备忘录模式保存数据状态,实现事务回滚。