zoukankan      html  css  js  c++  java
  • 014 --- 第18章 备忘录模式

    简述:

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

      备忘录模式包括:发起人类、备忘录类、管理者类。

        发起人类:负责创建一个备忘录对象,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。

        备忘录类:负责存储发起人对象的内部状态,并可防止发起人类以外的其他对象访问备忘录对象。

        管理者类:负责保存好备忘录对象。

    备忘录模式:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 // 备忘录模式
     5 // 备忘录类
     6 class CMemento
     7 {
     8 private:
     9     string m_szState;
    10 
    11 public:
    12     CMemento(string szState) { m_szState = szState; }
    13 
    14     string GetState() { return m_szState; }
    15 };
    16 // 发起人类
    17 class COriginator
    18 {
    19 private:
    20     string m_szState;
    21     CMemento* m_pMemento;
    22 
    23 public:
    24     ~COriginator()
    25     {
    26         if (m_pMemento)
    27         {
    28             delete m_pMemento;
    29             m_pMemento = NULL;
    30         }
    31     }
    32 
    33     void SetState(string szState) { m_szState = szState; }
    34 
    35     string GetState() { return m_szState; }
    36 
    37     CMemento* CreateMemento()
    38     {
    39         m_pMemento = new CMemento(m_szState);
    40         return m_pMemento;
    41     }
    42 
    43     void SetMemento(CMemento* pMemento) { m_szState = pMemento->GetState(); }
    44 
    45     void Show()
    46     {
    47         cout << "State = " << m_szState << endl;
    48     }
    49 };
    50 
    51 // 管理者类
    52 class CCaretaker
    53 {
    54 private:
    55     CMemento* m_pMemento;
    56 
    57 public:
    58     void SetMemento(CMemento* pMemento) { m_pMemento = pMemento; }
    59 
    60     CMemento* GetMemento() { return m_pMemento; }
    61 };
    62 
    63 int main()
    64 {
    65     COriginator Originator;
    66     Originator.SetState("On");
    67     Originator.Show();
    68 
    69     CCaretaker Caretaker;
    70     Caretaker.SetMemento(Originator.CreateMemento());
    71 
    72     Originator.SetState("Off");
    73     Originator.Show();
    74 
    75     Originator.SetMemento(Caretaker.GetMemento());
    76     Originator.Show();
    77 
    78     system("pause");
    79     return 0;
    80 }

    输出结果:

    例:游戏进度备忘

    代码如下:

      1 #include <iostream>
      2 using namespace std;
      3 
      4 // 角色状态存储类(备忘录类)
      5 class CRoleStateMemento
      6 {
      7 private:
      8     int m_nVit; // 生命力
      9     int m_nAtk; // 攻击力
     10     int m_nDef; // 防御力
     11 
     12 public:
     13     CRoleStateMemento(int nVit, int nAtk, int nDef)
     14     {
     15         m_nVit = nVit;
     16         m_nAtk = nAtk;
     17         m_nDef = nDef;
     18     }
     19     void SetVitality(int nVit) { m_nVit = nVit; }
     20 
     21     int GetVitality() { return m_nVit; }
     22 
     23     void SetAttack(int nAtk) { m_nAtk = nAtk; }
     24 
     25     int GetAttack() { return m_nAtk; }
     26 
     27     void SetDefense(int nDef) { m_nDef = nDef; }
     28 
     29     int GetDefense() { return m_nDef; }
     30 };
     31 
     32 // 游戏角色类(发起人类)
     33 class CGameRole
     34 {
     35 private:
     36     int m_nVit; // 生命力
     37     int m_nAtk; // 攻击力
     38     int m_nDef; // 防御力
     39     CRoleStateMemento* m_pRoleStateMemento;
     40 
     41 public:
     42     ~CGameRole()
     43     {
     44         if (m_pRoleStateMemento)
     45         {
     46             delete m_pRoleStateMemento;
     47             m_pRoleStateMemento = NULL;
     48         }
     49     }
     50     void SetVitality(int nVit) { m_nVit = nVit; }
     51 
     52     int GetVitality() { return m_nVit; }
     53 
     54     void SetAttack(int nAtk) { m_nAtk = nAtk; }
     55 
     56     int GetAttack() { return m_nAtk; }
     57 
     58     void SetDefense(int nDef) { m_nDef = nDef; }
     59 
     60     int GetDefense() { return m_nDef; }
     61 
     62     // 状态显示
     63     void StateDisplay()
     64     {
     65         cout << "角色当前状态:" << endl;
     66         cout << "体力:" << m_nVit << endl;
     67         cout << "攻击力:" << m_nAtk << endl;
     68         cout << "防御力:" << m_nDef << endl << endl;
     69     }
     70 
     71     // 获得初始状态
     72     void GetInitState()
     73     {
     74         m_nVit = 100;
     75         m_nAtk = 100;
     76         m_nDef = 100;
     77     }
     78 
     79     // 战斗
     80     void Fight()
     81     {
     82         m_nVit = 0;
     83         m_nAtk = 0;
     84         m_nDef = 0;
     85     }
     86 
     87     // 保存角色状态
     88     CRoleStateMemento* SaveState()
     89     {
     90         m_pRoleStateMemento = new CRoleStateMemento(m_nVit, m_nAtk, m_nDef);
     91         return m_pRoleStateMemento;
     92     }
     93 
     94     // 恢复角色状态
     95     void RecoveryState(CRoleStateMemento* pRoleStateMemento)
     96     {
     97         m_nVit = pRoleStateMemento->GetVitality();
     98         m_nAtk = pRoleStateMemento->GetAttack();
     99         m_nDef = pRoleStateMemento->GetDefense();
    100     }
    101 
    102     // ...
    103 };
    104 
    105 // 角色状态管理者类(管理者类)
    106 class CRoleStateCaretaker
    107 {
    108 private:
    109     CRoleStateMemento* m_pMemento;
    110 
    111 public:
    112     void SetRoleStateMemento(CRoleStateMemento* pMemento) { m_pMemento = pMemento; }
    113 
    114     CRoleStateMemento* GetRoleStateMemento() { return m_pMemento; }
    115 };
    116 
    117 int main()
    118 {
    119     // 大战BOSS前
    120     CGameRole GameRole;
    121     GameRole.GetInitState();
    122     GameRole.StateDisplay();
    123 
    124     // 保存进度
    125     CRoleStateCaretaker RoleStateCaretaker;
    126     RoleStateCaretaker.SetRoleStateMemento(GameRole.SaveState());
    127 
    128     //大战BOSS时,损耗严重
    129     GameRole.Fight();
    130     GameRole.StateDisplay();
    131 
    132     // 恢复之前状态
    133     GameRole.RecoveryState(RoleStateCaretaker.GetRoleStateMemento());
    134     GameRole.StateDisplay();
    135 
    136     system("pause");
    137     return 0;
    138 }

    运行结果:

  • 相关阅读:
    Parquet文件结构笔记
    parquet 简介
    Kubernetes 路由问题&网络问题
    postgresql:terminate hung query
    Python 动态加载并下载"梨视频"短视频
    Python 豆瓣mv爬取
    Ubuntu 硬盘分区只读,重新挂载为读写分区之后,文件依然创建出错
    Ubuntu 装机软件
    iTOP4412开发板相关内容
    linux driver ------ GPIO的驱动编写和调用
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13613936.html
Copyright © 2011-2022 走看看