如果能重來
“如果能重來,我要選李白···”,“曾經有一份····”,“多渴望能夠 找到一條時光隧道,重回到簡單,容易覺得美好”,“我靠,我被Boss打死了,還好我有存檔”····
哈哈哈,如果時光能倒流,那該能圓了我們多少遺憾。如果能重來,我決不會在你最重要的那段時間離開,回頭也已經於事無補了。
在從程序設計中,有一個“美名昭著”的“重來”,對,就是棧。
不過棧嘛,好用是固然的,但它和我們今天要講的“備忘錄模式”並不相沖,反而,還是相輔相成的呢。
“時光隧道”
我也曾寫過一些需要保存臨時數據的功能,但是寫那些功能的時候是真的煩躁,因爲我需要創建很多的對象,然後將數據一個一個塞進去,取出來的時候又要將數據一個一個進行輸出,這讓我感覺很不爽。不僅僅是工作量大,代碼重複度又高,關鍵是有些數據,它明明應該是私有變量,就這樣變成了公有變量,這讓我很相當不滿意,畢竟有誰會願意把自己的美好回憶公開呢?
這時候我們就需要使用一些技巧,在不破壞封裝性的前提下,將內部數據取出,存放,後期恢復。
這裏我們需要學習一下”備忘錄模式“的整體思路:
Originator(發起人):負責創建一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。Originator可以根據需要決定Memento的存儲內容。
Memento(備忘錄):負責存儲Originator的內部狀態,並可防止Originator以外的對象訪問備忘錄。備忘錄有兩個接口,Carataker只能看到備忘錄的窄接口。
Caretaker(管理者):負責保存好備忘錄,不能對備忘錄內容進行操作或檢查。
代碼實現
#include<iostring>
#include<string> //以此替代結構體,結構體要自己定義
uaing namespace std;
//備忘錄
class Memento{
private:
string State;//狀態,建議使用結構體存儲
public:
Memento(string value){State = value;}
string get_State(return State;);
}
//發起人
class Originator{
private:
string State; //狀態,建議使用結構體存儲
public:
string get_state(){return State;}
void set_state(string value){State = value;}
Memento Create_Memento(){return (new Memento(State));} //創建備忘錄,將當前需要的信息導入並實例化出一個Memento對象
void set_memento(Memento *memento){State = memento->get_State();} //恢復備忘錄
void show(){cout<<State<<endl;} //顯示數據
};
//管理者類
class Caretaker{
private:
Memento *memento;
public:
Memento get_Memento(){return memento;} //得到備忘錄
}
//主函數
int mian()
{
Originator *o = new Originator();
o->set_state("A");
o->show();
Caretaker *c = new Caretaker();
c->memento = o.Create_Memento();//保存狀態。有管理類擋在前面,很好的隱藏了備忘錄類的實現細節
o->set_state("B"); //更改狀態
o->show();
o->set_memento(c->memento); //恢復狀態,解釋同上
o->show();
}
應用場景
你懂得。