模式定義
備忘錄模式(Memento Pattern)是一種行為型設計模式,其核心是在不破壞對象封裝性的前提下,捕獲并保存對象的內部狀態,以便后續恢復。該模式特別適用于需要實現撤銷/重做、狀態回滾等功能的系統,如數控系統的加工狀態保存與恢復。
模式結構
發起人(Originator)
- 負責創建備忘錄(保存當前狀態)和從備忘錄恢復狀態。
備忘錄(Memento) - 存儲發起人的內部狀態,僅允許發起人訪問其數據。
管理者(Caretaker) - 保存和管理備忘錄,但不修改其內容。
適用場景
數控系統狀態保存:如加工參數(坐標、速度)的備份與恢復。
操作撤銷/重做:用戶誤操作后回滾到歷史狀態。
系統故障恢復:異常停機時恢復至安全狀態。
C++示例(數控系統場景)
場景說明:
數控機床在加工過程中需要保存當前狀態(坐標、速度),當發生異常時恢復至最近一次保存的狀態。
#include
#include
#include // 備忘錄:保存數控系統狀態
class CNCStateMemento {
private:std::string position_; // 坐標double speed_; // 速度
public:CNCStateMemento(std::string pos, double speed) : position_(pos), speed_(speed) {}// 僅允許Originator訪問(友元類)friend class CNCMachine;
};// 發起人:數控機床
class CNCMachine {
private:std::string position_;double speed_;
public:void setState(std::string pos, double speed) {position_ = pos;speed_ = speed;}CNCStateMemento* saveState() {return new CNCStateMemento(position_, speed_);}void restoreState(CNCStateMemento* memento) {position_ = memento->position_;speed_ = memento->speed_;std::cout << "恢復至狀態:坐標=" << position_ << ",速度=" << speed_ << std::endl;}void display() const {std::cout << "當前狀態:坐標=" << position_ << ",速度=" << speed_ << std::endl;}
};// 管理者:狀態歷史記錄
class CNCCaretaker {
private:std::vector history_;
public:void addMemento(CNCStateMemento* memento) {history_.push_back(memento);}CNCStateMemento* getLastMemento() {if (history_.empty()) return nullptr;CNCStateMemento* last = history_.back();history_.pop_back();return last;}
};// 客戶端使用示例
int main() {CNCMachine machine;CNCCaretaker caretaker;// 設置初始狀態并保存machine.setState("X100 Y200", 1500);caretaker.addMemento(machine.saveState());machine.display(); // 輸出當前狀態// 修改狀態(模擬異常操作)machine.setState("X150 Y250", 2000);std::cout << "異常操作后:";machine.display();// 恢復至最近保存的狀態CNStateMemento* lastState = caretaker.getLastMemento();if (lastState) {machine.restoreState(lastState);machine.display();}return 0;
}
代碼解析
CNCStateMemento:封裝數控機床的坐標和速度,僅允許CNCMachine
訪問(通過友元類)。
CNCMachine:作為發起人,提供saveState()
和restoreState()
方法實現狀態保存與恢復。
CNCCaretaker:管理歷史狀態,支持撤銷操作。
優勢與局限
優勢:
- 狀態封裝性良好,避免外部直接訪問。
- 簡化數控系統的狀態管理邏輯。
局限: - 頻繁保存狀態可能導致內存占用高。