1. 程式人生 > >行為型_備忘錄模式(Memento)

行為型_備忘錄模式(Memento)

nat count() .com take 增加 clas ostream 分享圖片 行為型

行為型_備忘錄模式(Memento)

作用場景:

當意圖在對象外面保存對象的內部狀態,但是又不想破壞對象的封裝性,就可以考慮備忘錄模式。

解釋:

其參與者包括

1、Memnto(備忘錄,如下列CountMemento )

2Originator(原發器,如下列Counter )

3Caretaker(管理者,如下列CounterCaretaker )

Memnto用於保存Originator內部狀態,其私有窄接口只能有Originator訪問,Caretaker只能訪問Memnto的寬接口。所以通常MemntoOriginator是友元。

例如;

一個計數器,有個初始狀態值,可以操作計數增加,後來我們想這個計數器或者另一個計數器也恢復成這個初始值。我們用備忘錄模式解決這個問題

類:

Counter 計數器

CountMemento 計數器備忘錄

CounterCaretaker 操作者

類圖:

技術分享圖片

代碼:

  

 1 #include <iostream>
 2 class CountMemento
 3 {
 4 public:
 5     CountMemento(int count) :m_count(count) {}
 6     ~CountMemento() {};
 7 private:
 8     friend class Counter;
 9     int getCount()
10     {
11         return
m_count; 12 } 13 int m_count; 14 }; 15 class Counter 16 { 17 public: 18 Counter(int count) :m_count(count) {} 19 ~Counter() {} 20 CountMemento* saveState() 21 { 22 return new CountMemento(m_count); 23 } 24 void recoverState(CountMemento* p_countMemento) 25 {
26 m_count = p_countMemento->getCount(); 27 } 28 void increase() { m_count++; } 29 void show() { printf("count :%d\n", m_count); } 30 private: 31 int m_count; 32 }; 33 34 class CounterCaretaker 35 { 36 public: 37 void setCountMemento(CountMemento* p_countMemento) 38 { 39 m_countMemento = p_countMemento; 40 } 41 CountMemento* getCountMemento() 42 { 43 return m_countMemento; 44 } 45 private: 46 CountMemento* m_countMemento; 47 }; 48 49 int main() 50 { 51 CounterCaretaker counterCaretaker; 52 Counter counter(20); 53 counter.show(); 54 printf("save counter...\n"); 55 counterCaretaker.setCountMemento(counter.saveState()); 56 printf("start incresing...\n"); 57 for (int i = 0; i < 5; ++i) 58 { 59 counter.increase(); 60 } 61 printf("after incresing...\n"); 62 counter.show(); 63 printf("recovering...\n"); 64 counter.recoverState(counterCaretaker.getCountMemento()); 65 counter.show(); 66 system("pause"); 67 }

行為型_備忘錄模式(Memento)