C++设计模式-备忘录模式
生活随笔
收集整理的這篇文章主要介紹了
C++设计模式-备忘录模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
基本概念
代碼與實例
?
基本概念
備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將對象恢復到原先保存的狀態。
?
結構圖如下(此圖來源于大話設計模式):
Originator為發起者
Memento為備忘錄
Caretaker為管理者
?
Memento模式比較適用于功能復雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一個小部分時,Originator可以根據保存的Memento信息還原到前一個狀態。
?
?
代碼與實例
如下程序運行截圖如下:
源碼如下:
Head.h
#ifndef HEAD_H #define HEAD_H#include <iostream> #include <string> using namespace std;class Memento;//發起人 Originator 類 class Originator{public:const string &getState();void setState(const string &value);Memento *createMemento();void setMemento(Memento *m);void printCurrentState();Originator();~Originator();private:string state;Memento *memento; };//備忘錄 Memento 類 class Memento{public:Memento(const string &s);Memento(Memento *m);const Memento &operator=(Memento *copy);const string &getState();private:string state; };//管理者 Caretaker類 class Caretaker{public:Caretaker();~Caretaker();Memento *getMemento();void setMemento(Memento *m);private:Memento *memento; };#endif HEAD_HHead.cpp
#include "Head.h"const std::string & Originator::getState() {return state; }void Originator::setState(const string &value) {this->state = value; }Memento * Originator::createMemento() {if(memento != nullptr)delete memento;memento = new Memento(state);return memento; }void Originator::setMemento(Memento *m) {if(nullptr != memento)delete memento;memento = new Memento(m);this->state = memento->getState(); }void Originator::printCurrentState() {cout << "當前的狀態 : " << this->state << endl; }Originator::Originator() {memento = nullptr; }Originator::~Originator() {if(memento != nullptr)delete memento; }Memento::Memento(const string &s) {this->state = s; }Memento::Memento(Memento *m) {this->state = m->getState(); }const Memento &Memento::operator=(Memento *copy){this->state = copy->getState();return *this; }const std::string & Memento::getState() {return this->state; }Caretaker::Caretaker() {this->memento = nullptr; }Caretaker::~Caretaker() {if(memento != nullptr)delete memento; }Memento * Caretaker::getMemento() {return this->memento; }void Caretaker::setMemento(Memento *m) {if(this->memento != nullptr)delete memento;this->memento = new Memento(m); }Main.cpp
#include "Head.h"int main(int *argc, int *argv){//發起人的初始狀態Originator *o = new Originator;o->setState("最開始的記錄");o->printCurrentState();//保存其狀態Caretaker *c = new Caretaker;c->setMemento(o->createMemento());cout << "管理者目前保存的狀態 : " << c->getMemento()->getState() << endl;//改變發起人狀態o->setState("我改變了");o->printCurrentState();//恢復o->setMemento(c->getMemento());o->printCurrentState();delete c;delete o;getchar();return 0; }?
總結
以上是生活随笔為你收集整理的C++设计模式-备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统架构师学习笔记-开发管理
- 下一篇: Java工作笔记-IntelliJ ID