目录
1、备忘录模式(Memento Pattern)含义
2、备忘录模式的UML图学习
3、备忘录模式的应用场景
4、备忘录模式的优缺点
(1)优点:
(2)缺点
5、C++实现备忘录模式的实例
1、备忘录模式(Memento Pattern)含义
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。【DP】
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下捕获和存储一个对象的内部状态,并在需要时恢复该状态。它将对象的状态保存到备忘录对象中,然后可以通过备忘录对象来还原对象的状态。
2、备忘录模式的UML图学习
备忘录模式的主要角色包括:
(1)Originator(发起人):负责创建一个备忘录对象,用于记录当前对象的内部状态,并可以使用备忘录对象来恢复其状态。
(2)Memento(备忘录):用于存储Originator对象的内部状态。
(3)Caretaker(管理者):负责保存备忘录对象,但不能对备忘录对象进行修改或检查。
3、备忘录模式的应用场景
(1)需要保存和恢复对象的历史状态。
(2)需要提供撤销操作或者回滚操作的系统。
(3)需要对对象的状态进行快照并进行比较的系统。
4、备忘录模式的优缺点
(1)优点:
1)提供了一种可靠的方式来保存和恢复对象的状态,避免了直接暴露对象的内部细节。
2)备忘录对象与原始对象解耦,使得原始对象可以专注于业务逻辑,而不必关心状态的保存和恢复。
3)可以灵活地扩展备忘录对象的功能,例如支持多个历史状态的保存和恢复。
(2)缺点
1)如果原始对象的状态较大或者频繁改变,会占用较大的内存空间。
2)在保存和恢复状态时,需要进行对象的序列化和反序列化操作,可能会影响性能。
5、C++实现备忘录模式的实例
#include <iostream>
#include <string>
// 备忘录类
class Memento {
public:
Memento(const std::string& state) : state_(state) {}
std::string getState() const {
return state_;
}
private:
std::string state_;
};
// 发起人类
class Originator {
public:
void setState(const std::string& state) {
state_ = state;
}
std::string getState() const {
return state_;
}
Memento createMemento() {
return Memento(state_);
}
void restoreMemento(const Memento& memento) {
state_ = memento.getState();
}
private:
std::string state_;
};
// 管理者类
class Caretaker {
public:
void saveMemento(const Memento& memento) {
memento_ = memento;
}
Memento retrieveMemento() const {
return memento_;
}
private:
Memento memento_;
};
int main()
{
Originator originator;
Caretaker caretaker;
// 设置初始状态
originator.setState("State 1");
std::cout << "Current state: " << originator.getState() << std::endl;
// 保存状态
caretaker.saveMemento(originator.createMemento());
// 修改状态
originator.setState("State 2");
std::cout << "Current state: " << originator.getState() << std::endl;
// 恢复状态
originator.restoreMemento(caretaker.retrieveMemento());
std::cout << "Restored state: " << originator.getState() << std::endl;
return 0;
}
在上述示例中,Originator类表示发起人,Caretaker类表示管理者,Memento类表示备忘录。通过调用createMemento方法可以创建一个备忘录对象,并通过restoreMemento方法来恢复对象的状态。