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


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

    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;
    };

  • 相关阅读:
    APP 打包成功的四种方法 转自
    设置启动页
    大数据之医疗行业数据分析
    实验三(FCFS ,SJF,HRRN)
    实验四 用信号量解决进程互斥与同步问题
    实验二 (3)最短作业优先调度
    实验二 (2)优先数调度
    实验二 (1)先来先服务进程调度
    实验一
    Hdoj 1253
  • 原文地址:https://www.cnblogs.com/zhangjxblog/p/8954087.html
Copyright © 2020-2023  润新知