大话设计模式-备忘录模式

备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

Memento模式比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性的一小部分。

//mementorole.h

 

#pragma  once
#include <iostream>
using namespace std;
class MementoRole{
private:
    int vit;//生命值
    int def;//防御
    int atk;//攻击
public:
    MementoRole(int vit,int def,int atk){
        this->vit = vit;
        this->def = def;
        this->atk = atk;
    }
    int getVit(){return vit;}
    int getDef(){return def;}
    int getAtk(){return atk;}
    ~MementoRole(){
        cout << "~MementoRole()" << endl;
    }

};

 

//OrignatorRole.h

#pragma  once

#include "mementorole.h"
#include <iostream>
using namespace std;
class OrignatorRole{

private:
    MementoRole *mr;
public:
    OrignatorRole(){
        mr = NULL;
    }
    void setMemento(MementoRole *mr){
        this->mr = mr;
    }
    MementoRole *getMemento(){
        return mr;
    }
    ~OrignatorRole(){
        cout << "~OrignatorRole()" << endl;
        if(mr != NULL){
            delete mr;
            cout << "delete mr" << endl;
        }
    }

};

//role.h

#pragma once
#include <iostream>
#include "mementorole.h"

using namespace  std;
class Role{

private:
    int vit;//生命值
    int def;//防御
    int atk;//攻击
public:
    MementoRole* createMemento(){
        return new MementoRole(vit,def,atk);
    }
    void setMemento(MementoRole *mr){
        this->vit = mr->getVit();
        this->def = mr->getDef();
        this->atk = mr->getAtk();
    }

    void setVit(int v){this->vit = v;    }
    void setDef(int d){this->def = d;    }
    void setAtk(int a){this->atk = a;    }

    void show(){
        cout << "vit = " << vit << endl;
        cout << "def= " << def << endl;
        cout << "atk = " << atk << endl;
    }
    ~Role(){
        cout << "~Role()" << endl;
    }
};

//main.cpp

#include <iostream>
#include <cstdlib>
#include "role.h"
#include "OrignatorRole.h"
using namespace std;
int main(){

    cout << "开始:" << endl;
    Role *r = new Role();
    r->setVit(100);
    r->setDef(100);
    r->setAtk(100);
    r->show();
    OrignatorRole *or = new OrignatorRole();
    or->setMemento(r->createMemento());
    cout << "中间:" << endl;
    r->setVit(10);
    r->setDef(10);
    r->setAtk(10);
    r->show();
    cout << "恢复开始:" << endl;
    r->setMemento(or->getMemento());
    r->show();

    delete r;
    delete or;
    return 0;
};

 

posted @ 2018-04-26 17:47  头文件1991  阅读(141)  评论(0编辑  收藏  举报