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

首頁 > 編程 > C++ > 正文

設計模式中的備忘錄模式解析及相關C++實例應用

2020-05-23 14:07:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了設計模式中的備忘錄模式解析及相關C++實例應用,備忘錄模式也經常被用來在命令模式中維護可以撤銷(Undo)操作的狀態,需要的朋友可以參考下
 

備忘錄模式旨在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。在命令模式中,備忘錄模式經常還經常被用來維護可以撤銷(Undo)操作的狀態。

類圖:

設計模式,備忘錄模式,C++

  • Originator:負責創建一個備忘錄Memento,用以記錄當前時刻它的內部狀態,并可使用備忘錄恢復內部狀態。Originator可根據需要決定Memento存儲Originator的哪些內部狀態。
  • Memento:負責存儲Originator對象的內部狀態,并可防止Originator以外的其他對象訪問備忘錄Memento。備忘錄有兩個接口,Caretaker只能看到備忘錄的窄接口,它只能將備忘錄傳遞給其他對象。Originator能夠看到一個寬接口,允許它訪問返回到先前狀態所需的所有數據。
  • Caretaker:負責保存好備忘錄Memento,不能對備忘錄的內容進行操作或檢查。

Memento模式中封裝的是需要保存的狀態,當需要恢復的時候才取出來進行恢復.原理很簡單,實現的時候需要注意一個地方:窄接口和寬接口.所謂的寬接口就是一般意義上的接口,把對外的接口作為public成員;而窄接口反之,把接口作為private成員,而把需要訪問這些接口函數的類作為這個類的友元類,也就是說接口只暴露給了對這些接口感興趣的類,而不是暴露在外部.下面的實現就是窄實現的方法來實現的.

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

如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲可撤銷操作的狀態。
實例:

#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日,光棍節,一個人,沒有女朋友");   CareTaker *caretaker = new CareTaker();   caretaker->SetMemento(originator->CreateMemento());      cout<<"2012年11月11日,光棍節早晨的狀態是:"<<endl;    originator->ShowState();    originator->SetState("中午參加同學婚禮去了,錦府鹽幫飯店");   originator->ShowState();    cout<<"晚上回來的狀態是"<<endl;   originator->RestoreMemento(caretaker->GetMemento());   originator->ShowState();    cout<<"跟早晨一樣,嗨"<<endl;    system("pause");   return 0; } 

輸出是這樣的

設計模式,備忘錄模式,C++

 

備忘錄模式適用性:

  • 必須保存一個對象在某一個時刻的(部分)狀態, 這樣以后需要時它才能恢復到先前的狀態。
  • 如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白山市| 镇康县| 虎林市| 九台市| 宁武县| 开江县| 平乐县| 藁城市| 巫溪县| 绩溪县| 永福县| 西林县| 土默特左旗| 奉新县| 河西区| 治县。| 西畴县| 呈贡县| 濮阳县| 石阡县| 遵化市| 葫芦岛市| 新河县| 五峰| 鹤庆县| 长汀县| 景宁| 临潭县| 略阳县| 磴口县| 怀化市| 高邑县| 长宁县| 紫云| 浦东新区| 石城县| 林口县| 申扎县| 嘉禾县| 鄂伦春自治旗| 周口市|