行為型_備忘錄模式(Memento)
阿新 • • 發佈:2018-12-09
nat count() .com take 增加 clas ostream 分享圖片 行為型
行為型_備忘錄模式(Memento)
作用場景:
當意圖在對象外面保存對象的內部狀態,但是又不想破壞對象的封裝性,就可以考慮備忘錄模式。
解釋:
其參與者包括
1、Memnto(備忘錄,如下列CountMemento )
2、Originator(原發器,如下列Counter ),
3、Caretaker(管理者,如下列CounterCaretaker )
Memnto用於保存Originator內部狀態,其私有窄接口只能有Originator訪問,Caretaker只能訪問Memnto的寬接口。所以通常Memnto和Originator是友元。
例如;
一個計數器,有個初始狀態值,可以操作計數增加,後來我們想這個計數器或者另一個計數器也恢復成這個初始值。我們用備忘錄模式解決這個問題
類:
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 returnm_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)