用C++跟你聊聊“備忘錄模式” ,如果能重來,我要···

在這裏插入圖片描述

如果能重來

“如果能重來,我要選李白···”,“曾經有一份····”,“多渴望能夠 找到一條時光隧道,重回到簡單,容易覺得美好”,“我靠,我被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();
}

應用場景

你懂得。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章