【設計模式】——備忘錄模式

備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態。ios

  Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。Originator可根據須要決定Memento存儲Originator的那些狀態。Memento(備忘錄):負責存儲Originator對象的內部狀態,並可防止Originator之外的對象訪問備忘錄Memento。備忘錄有兩個接口,Caretaker只能看到備忘錄的窄接口,它只能將備忘錄傳遞給其餘對象。Originator可以看到一個寬接口,容許它訪問返回到先前狀態所需的全部數據。Caretaker(管理者):負責保存好備忘錄Memento,不能對備忘錄的內容進行操做或檢查。這當中要保存的細節給封裝在了Memento中,那一天要更改保存的細節也不用影響客戶端了。this

  代碼基本模板spa

#include <iostream>

using namespace std;
//備忘錄(Memento)類
class Memento
{
private:
    string m_state;
public:
    Memento(string state):m_state(state)
    {
    }
    string getState()
    {
        return this->m_state;
    }
};
//發起人(Originator)類
class Originator
{
private:
    string m_state;
public:
    void setState(string state)
    {
        this->m_state=state;
    }
    string getState()
    {
        return this->m_state;
    }
    //建立備忘錄,將當前須要保存的信息導入並實例化一個Memento對象
    Memento *CreateMemento()
    {
        return (new Memento(this->m_state));
    }
    //恢復備忘錄,將Memento導入並將相關數據恢復
    void SetMemento(Memento *memento)
    {
        this->m_state=memento->getState();
    }
    void Show()
    {
        cout << "State=" << this->m_state << endl;
    }
};
//管理者(Caretaker)類
class Caretaker
{
private:
    Memento *m_memento;
public:
    //設置備忘錄
    void setMemento(Memento *memento)
    {
        this->m_memento=memento;
    }
    //獲得備忘錄
    Memento *getMemento()
    {
        return this->m_memento;
    }
};
int main()
{
    Originator *O=new Originator();
    O->setState("On");
    O->Show();
    Caretaker *c=new Caretaker();
    c->setMemento(O->CreateMemento());
    O->setState("Off");
    O->Show();
    O->SetMemento(c->getMemento());
    O->Show();
    return 0;
}

備忘錄所用場合:Memento模式比較適用於功能比較複雜的,但須要維護或記錄屬性歷史的類,或者須要保存的屬性只是衆多屬性中的一小部分時,Originator能夠根據保存的Memento信息還原到前一狀態。若是在某個系統中使用命令模式時,須要實現命令的撤銷功能,那麼命令模式可使用備忘錄模式來保存可撤銷操做的狀態。有時一些對象的內部信息必須保存在對象之外的地方,可是必需要有對象本身讀取,這時,使用備忘錄能夠把複雜的對象內部信息對其餘的對象屏蔽起來,從而能夠恰當地保持封裝的邊界。其實最大的做用是在當角色的狀態改變的時候,有可能這個狀態無效,這時候就可使用暫時存儲起來的備忘錄將狀態復原。code

 

遊戲進度備忘對象

#include <iostream>

using namespace std;
class RoleStateMemento
{
 private:
    int m_vit;
    int m_atk;
    int m_def;
 public:
    RoleStateMemento(int vit,int atk,int def)
    {
        this->m_vit=vit;
        this->m_atk=atk;
        this->m_def=def;
    }
    int getVit()
    {
        return this->m_vit;
    }
    int getAtk()
    {
        return this->m_atk;
    }
    int getDef()
    {
        return this->m_def;
    }
};
class GameRoles
{
private:
    int m_vit;
    int m_atk;
    int m_def;
public:
    RoleStateMemento *SaveState()
    {
        return (new RoleStateMemento(this->m_vit,this->m_atk,this->m_def));
    }
    void RecoveryState(RoleStateMemento *memento)
    {
        this->m_vit=memento->getVit();
        this->m_atk=memento->getAtk();
        this->m_def=memento->getDef();
    }
    void GetInitState()
    {
        this->m_vit=100;
        this->m_atk=100;
        this->m_def=100;
    }
    void Fight()
    {
        this->m_vit=0;
        this->m_atk=0;
        this->m_def=0;
    }
    void StateDisplay()
    {
        cout << "角色當前狀態:" << endl;
        cout << "體力:" << this->m_vit << endl;
        cout << "攻擊力:" << this->m_atk << endl;
        cout << "防護力:" << this->m_def << endl;
    }
};
class RoleStateCaretaker
{
private:
    RoleStateMemento *m_memento;
public:
    void SetMemento(RoleStateMemento *memento)
    {
        this->m_memento=memento;
    }
    RoleStateMemento *GetMemento()
    {
        return this->m_memento;
    }
};
int main()
{
    //大戰Boss前
    GameRoles *lixiaoyao=new GameRoles();
    lixiaoyao->GetInitState();
    lixiaoyao->StateDisplay();
    //保存進度
    RoleStateCaretaker *stateAdmin=new RoleStateCaretaker();
    stateAdmin->SetMemento(lixiaoyao->SaveState());
    //大戰Boss時,損耗嚴重
    lixiaoyao->Fight();
    lixiaoyao->StateDisplay();
    //恢復以前狀態
    lixiaoyao->RecoveryState(stateAdmin->GetMemento());
    lixiaoyao->StateDisplay();
    return 0;
}
相關文章
相關標籤/搜索