C++設計模式[十七]備忘錄模式




備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。說白了就是保存功能,像我們玩游戲時的及時保存操作。

一個備忘錄是一個對象,它存儲另一個對象在某個瞬間的內部狀態,而后者稱為備忘錄的原發器。當需要設置原發器的檢查點時,取消操作機制會向原發器請求一個備忘錄。原發器用描述當前狀態的信息初始化該備忘錄。只有原發器可以向備忘錄中存取信息,備忘錄對其他的對象是“不可見”的。

果凍想 | 一個原創文章分享網站

Memento:備忘錄存儲原發器對象的內部狀態。原發器根據需要決定備忘錄存儲原發器的哪些內部狀態;防止原發器以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,管理者只能看到備忘錄的窄接口————它只能將備忘錄傳遞給其他對象。相反,原發器能夠看到一個寬接口,允許它訪問返回到先前狀態所需的所有數據。理想的情況是只允許生成備忘錄的那個原發器訪問本備忘錄的內部狀態;
Originator:原發器創建一個備忘錄,用以記錄當前時刻它的內部狀態;我們使用備忘錄恢復內部狀態;
Caretaker:負責保存好備忘錄;但是,不能對備忘錄的內容進行操作或檢查。

一個簡單例子:

#include <iostream>
#include <string>
using namespace std;
class Memento {
private:
string state;


public:
Memento()
{
state = "";
}
Memento(string state){
this->state = state;
}
string getState() {
return state;
}
void setState(string state) {
this->state = state;
}
};


class Originator {
private :
string state;


public:
Originator()
{
state = "";
}


string getState() {
return state;
}
void setState(string state) {
this->state = state;
}
Memento createMemento(){
return Memento(this->state);
}
void restoreMemento(Memento memento){
this->setState(memento.getState());
}
};




class Caretaker {
private :
Memento memento;
public :
Memento getMemento(){
return memento;
}
void setMemento(Memento memento){
this->memento = memento;
}
};
int main (int argc, char *argv[])
{
Originator originator;
originator.setState("狀態1");
cout<<"初始狀態:"<<originator.getState()<<endl;
Caretaker caretaker;
caretaker.setMemento(originator.createMemento());
originator.setState("狀態2");
cout<<"改變后狀態:"<<originator.getState()<<endl;
originator.restoreMemento(caretaker.getMemento());
cout<<"恢復后狀態:"<<originator.getState()<<endl;
}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com