欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年03月10日 09:44:51   作者:mafuli007  
這篇文章主要介紹了設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用,備忘錄模式也經(jīng)常被用來(lái)在命令模式中維護(hù)可以撤銷(Undo)操作的狀態(tài),需要的朋友可以參考下

備忘錄模式旨在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。在命令模式中,備忘錄模式經(jīng)常還經(jīng)常被用來(lái)維護(hù)可以撤銷(Undo)操作的狀態(tà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ù)的類作為這個(gè)類的友元類,也就是說(shuō)接口只暴露給了對(duì)這些接口感興趣的類,而不是暴露在外部.下面的實(shí)現(xiàn)就是窄實(shí)現(xiàn)的方法來(lái)實(shí)現(xiàn)的.

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

如果在某個(gè)系統(tǒng)中使用命令模式時(shí),需要實(shí)現(xiàn)命令的撤銷功能,那么命令模式可以使用備忘錄模式來(lái)存儲(chǔ)可撤銷操作的狀態(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ì)象的封裝性。

相關(guān)文章

  • MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    這篇文章主要為大家詳細(xì)介紹了MATLAB實(shí)現(xiàn)五子棋游戲,可以進(jìn)行雙人對(duì)戰(zhàn)、也可悔棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Qt設(shè)置窗體(QWidget)透明度的方法總結(jié)

    Qt設(shè)置窗體(QWidget)透明度的方法總結(jié)

    在Qt開(kāi)發(fā)中,有的時(shí)候需要為窗體設(shè)置透明度。這篇文章主要為大家介紹幾個(gè)Qt中窗體設(shè)置透明度的方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-11-11
  • undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    編譯時(shí)出現(xiàn)undefined reference to `SetPduPowerConsumptionCnt'錯(cuò)誤要如何解決呢?有沒(méi)有什么好的解決方法?下面小編就為大家解答吧,如果你也遇到了這種情況,可以過(guò)來(lái)參考下
    2013-07-07
  • c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例)

    c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例)

    這篇文章主要介紹了c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例),需要的朋友可以參考下
    2018-01-01
  • C++繼承的賦值轉(zhuǎn)換與菱形虛擬繼承深入詳解

    C++繼承的賦值轉(zhuǎn)換與菱形虛擬繼承深入詳解

    今天我要給大家介紹C++中更深入的內(nèi)容了,C++繼承的賦值轉(zhuǎn)換與菱形虛擬繼承。C++這門(mén)語(yǔ)言為了使代碼不冗余,做了些什么操作呢?C++的繼承就很好地實(shí)現(xiàn)了類層次的代碼復(fù)用,今天我就要來(lái)和大家好好聊一聊它了
    2022-08-08
  • 關(guān)于C語(yǔ)言文件操作方法

    關(guān)于C語(yǔ)言文件操作方法

    這篇文章主要介紹了關(guān)于C語(yǔ)言文件操作方法的相關(guān)資料,需要的朋友可以參考下
    2018-03-03
  • C語(yǔ)言三子棋小游戲的實(shí)現(xiàn)代碼

    C語(yǔ)言三子棋小游戲的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言三子棋小游戲的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++?Protobuf的學(xué)習(xí)使用指南

    C++?Protobuf的學(xué)習(xí)使用指南

    protocol?buffers是一種語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,它可用于(數(shù)據(jù))通信協(xié)議、數(shù)據(jù)存儲(chǔ)等,下面就來(lái)跟隨小編一起簡(jiǎn)單學(xué)習(xí)一下它的使用吧
    2023-07-07
  • C++超詳細(xì)講解邏輯操作符

    C++超詳細(xì)講解邏輯操作符

    在C語(yǔ)言中,邏輯運(yùn)算符有&&、||、!;&&表示“與”的意思,需要兩端的表達(dá)式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達(dá)式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換
    2022-06-06
  • C語(yǔ)言實(shí)現(xiàn)2048游戲(ege圖形庫(kù)版)

    C語(yǔ)言實(shí)現(xiàn)2048游戲(ege圖形庫(kù)版)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)2048游戲,ege圖形庫(kù)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論