国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用

2020-01-26 14:41:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

備忘錄模式旨在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。在命令模式中,備忘錄模式經(jīng)常還經(jīng)常被用來(lái)維護(hù)可以撤銷(xiāo)(Undo)操作的狀態(tài)。

類(lèi)圖:

201631094239513.png (621×284)

  • Originator:負(fù)責(zé)創(chuàng)建一個(gè)備忘錄Memento,用以記錄當(dāng)前時(shí)刻它的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Originator可根據(jù)需要決定Memento存儲(chǔ)Originator的哪些內(nèi)部狀態(tài)。
  • Memento:負(fù)責(zé)存儲(chǔ)Originator對(duì)象的內(nèi)部狀態(tài),并可防止Originator以外的其他對(duì)象訪問(wèn)備忘錄Memento。備忘錄有兩個(gè)接口,Caretaker只能看到備忘錄的窄接口,它只能將備忘錄傳遞給其他對(duì)象。Originator能夠看到一個(gè)寬接口,允許它訪問(wèn)返回到先前狀態(tài)所需的所有數(shù)據(jù)。
  • Caretaker:負(fù)責(zé)保存好備忘錄Memento,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作或檢查。

Memento模式中封裝的是需要保存的狀態(tài),當(dāng)需要恢復(fù)的時(shí)候才取出來(lái)進(jìn)行恢復(fù).原理很簡(jiǎn)單,實(shí)現(xiàn)的時(shí)候需要注意一個(gè)地方:窄接口和寬接口.所謂的寬接口就是一般意義上的接口,把對(duì)外的接口作為public成員;而窄接口反之,把接口作為private成員,而把需要訪問(wèn)這些接口函數(shù)的類(lèi)作為這個(gè)類(lèi)的友元類(lèi),也就是說(shuō)接口只暴露給了對(duì)這些接口感興趣的類(lèi),而不是暴露在外部.下面的實(shí)現(xiàn)就是窄實(shí)現(xiàn)的方法來(lái)實(shí)現(xiàn)的.

Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄歷史屬性的類(lèi),或者需要保存的屬性只是眾多屬性中的一小部分時(shí),Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。

如果在某個(gè)系統(tǒng)中使用命令模式時(shí),需要實(shí)現(xiàn)命令的撤銷(xiāo)功能,那么命令模式可以使用備忘錄模式來(lái)存儲(chǔ)可撤銷(xiāo)操作的狀態(tài)。
實(shí)例:

#include <iostream> #include <string> using namespace std;  class Memento { private:   string state;  public:   Memento(string state)     :state(state)   {}   string GetState()   {     return state;   }   void SetState(string state)   {     this->state = state;   } };  class CareTaker { private:   Memento *memento;  public:   void SetMemento(Memento *memento)   {     this->memento = memento;   }   Memento* GetMemento()   {     return this->memento;   } };  class Originator { private:   string state;    public:   Originator(string state)   {     this->state = state;   }    void RestoreMemento(Memento *memento)   {     state = memento->GetState();   }    Memento *CreateMemento()   {     return new Memento(state);   }    void SetState(string state)   {     this->state = state;   }    void ShowState()   {     cout<< this->state <<endl;   } };  int main() {   Originator *originator = new Originator("2012年11月11日,光棍節(jié),一個(gè)人,沒(méi)有女朋友");   CareTaker *caretaker = new CareTaker();   caretaker->SetMemento(originator->CreateMemento());      cout<<"2012年11月11日,光棍節(jié)早晨的狀態(tài)是:"<<endl;    originator->ShowState();    originator->SetState("中午參加同學(xué)婚禮去了,錦府鹽幫飯店");   originator->ShowState();    cout<<"晚上回來(lái)的狀態(tài)是"<<endl;   originator->RestoreMemento(caretaker->GetMemento());   originator->ShowState();    cout<<"跟早晨一樣,嗨"<<endl;    system("pause");   return 0; } 

輸出是這樣的

201631094329663.png (677×441)

備忘錄模式適用性:

  • 必須保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的(部分)狀態(tài), 這樣以后需要時(shí)它才能恢復(fù)到先前的狀態(tài)。
  • 如果一個(gè)用接口來(lái)讓其它對(duì)象直接得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇赉县| 会泽县| 三都| 安阳市| 南部县| 清河县| 陆川县| 东乡| 平和县| 惠州市| 新余市| 乌鲁木齐市| 东乡县| 仁寿县| 钟祥市| 公安县| 镇雄县| 仙桃市| 康保县| 澜沧| 合川市| 邵阳市| 深圳市| 乌鲁木齐市| 邯郸市| 郸城县| 泽普县| 宁海县| 珠海市| 南靖县| 兴隆县| 海原县| 东丰县| 徐汇区| 河津市| 仙桃市| 翁源县| 河源市| 仙桃市| 禹城市| 安康市|