定義
備忘錄模式(Memento Pattern)是一種行為設計模式,它允許在不破壞封裝性的前提下捕獲一個對象的內部狀態,并在以后將對象恢復到該狀態。備忘錄模式通常用于實現撤銷操作(Undo)或歷史記錄(History)等功能。
在備忘錄模式中,我們定義三個角色:
- Originator:記錄當前時刻它的內部狀態,并可使用備忘錄對象恢復到之前的狀態。
- Memento:負責存儲Originator對象的內部狀態,并可防止Originator以外的對象訪問備忘錄。
- Caretaker:負責保存好備忘錄對象,不能對備忘錄的內容進行操作或檢查。
示例
下面是一個C++的備忘錄模式示例:
#include <iostream>
#include <string>
#include <vector> // Memento類,存儲Originator的內部狀態
class Memento {
public: std::string state; // 假設Originator有一個string類型的狀態 // 構造函數,用于從Originator獲取狀態 Memento(const std::string& state) : state(state) {}
}; // Originator類,負責創建Memento,并可以使用Memento恢復狀態
class Originator {
private: std::string state; // Originator的內部狀態 public: // 獲取當前狀態 std::string getState() const { return state; } // 設置狀態 void setState(const std::string& newState) { state = newState; std::cout << "Originator state changed to: " << state << std::endl; } // 創建Memento對象,保存當前狀態 Memento* createMemento() { return new Memento(state); } // 使用Memento恢復狀態 void restoreMemento(const Memento* memento) { state = memento->state; std::cout << "Originator state restored to: " << state << std::endl; }
}; // Caretaker類,負責保存Memento對象
class Caretaker {
private: std::vector<Memento*> mementos; // 存儲Memento對象的容器 public: // 添加Memento到容器中 void addMemento(Memento* memento) { mementos.push_back(memento); } // 獲取Memento對象,用于恢復狀態 Memento* getMemento(int index) { if (index >= 0 && index < mementos.size()) { return mementos[index]; } return nullptr; }
}; int main() { Originator* originator = new Originator(); Caretaker* caretaker = new Caretaker(); // 設置Originator的初始狀態 originator->setState("Initial State"); // 保存當前狀態到Caretaker caretaker->addMemento(originator->createMemento()); // 修改Originator的狀態 originator->setState("Modified State"); // 使用Caretaker中的Memento恢復Originator的狀態 originator->restoreMemento(caretaker->getMemento(0)); // 清理資源 delete originator; delete caretaker; return 0;
}
在這個示例中:
Memento
?類存儲了?Originator
?的內部狀態,即一個字符串?state
。Originator
?類有一個私有成員?state
,并提供了?setState
?和?getState
?方法來修改和獲取這個狀態。它還提供了?createMemento
?方法來創建一個包含當前狀態的?Memento
?對象,以及?restoreMemento
?方法來根據?Memento
?對象恢復狀態。Caretaker
?類負責保存?Memento
?對象,并提供?addMemento
?和?getMemento
?方法來添加和獲取?Memento
?對象。
在?main
?函數中,我們創建了一個?Originator
?對象和一個?Caretaker
?對象。我們首先設置了?Originator
?的初始狀態,并將這個狀態保存到?Caretaker
?中。然后我們修改了?Originator
?的狀態,并使用?Caretaker
?中保存的?Memento
?對象來恢復?Originator
?的狀態。
這個示例展示了如何使用備忘錄模式來保存和恢復對象的狀態。在實際應用中,備忘錄模式常用于實現撤銷操作、歷史記錄、事務處理等需要保存和恢復對象狀態的功能。