zoukankan      html  css  js  c++  java
  • C++设计模式之备忘录模式

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]。举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。

              Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。下面给出一个简单的是实现。

    代码实现:

     1 // Memento.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 #include <string>
     7 #include<vector>
     8 using namespace std;
     9 
    10 class Memento
    11 {
    12 
    13 public:
    14     int m_vitality; //生命值
    15     int m_attack;   //进攻值
    16     int m_defense;  //防守值
    17     Memento(int vitality,int attack,int defense):m_vitality(vitality),m_attack(attack),m_defense(defense) {}
    18     Memento& operator=(const Memento &memento) 
    19     {
    20         m_vitality = memento.m_vitality;
    21         m_attack = memento.m_attack;
    22         m_defense = memento.m_defense;
    23         return *this;
    24     }
    25 };
    26 
    27 class GameRole 
    28 {
    29 private:
    30     int m_vitality; //生命值
    31     int m_attack;   //进攻值
    32     int m_defense;  //防守值
    33 public:
    34     GameRole():m_vitality(100),m_attack(100),m_defense(100) {}
    35     Memento Save()
    36     {
    37         Memento memento(m_vitality,m_attack,m_defense);
    38         return memento;
    39     }
    40     void Load(Memento memento)
    41     {
    42         m_vitality = memento.m_vitality;
    43         m_attack = memento.m_attack;
    44         m_defense = memento.m_defense;
    45     }
    46     void show()
    47     {
    48         cout<<"vitality:"<<m_vitality<<",attack:"<<m_attack<<",defense"<<m_defense<<endl;
    49     }
    50     void Attack()
    51     {
    52         m_vitality -= 10;
    53         m_attack -= 10;
    54         m_defense -= 10;
    55     }
    56 
    57 };
    58 
    59 class Caretake 
    60 {
    61 public:
    62     Caretake() {}
    63     void Save(Memento memento){m_vecMemento.push_back(memento);}
    64     Memento Load(int state) { return m_vecMemento[state]; }
    65 private:
    66     vector<Memento> m_vecMemento;
    67 };
    68 
    69 
    70 int _tmain(int argc, _TCHAR* argv[])
    71 {
    72     Caretake caretake;
    73     GameRole role; 
    74     role.show();   //初始值
    75     caretake.Save(role.Save()); //保存状态
    76     role.Attack();   
    77     role.show();  //进攻后
    78     role.Load(caretake.Load(0)); //载入状态 
    79     role.show();  //恢复到状态0
    80     system("pause");
    81     return 0;
    82 }
  • 相关阅读:
    函数——返回值不止一个的情况(解一元二次方程)
    排序方法:去掉最高最低分求平均分 函数
    丢羊 递归
    网吧充值 函数+Swich+ArrayList版
    对战游戏自己简单版+大神版
    简单Struct+ArrayList选择买东西:购物车思路
    推箱子 复杂版(多个箱子)
    stuct+ArrayList的for用法
    Struct+ArrayList冒泡排序。例
    c# 穷举
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9292742.html
Copyright © 2011-2022 走看看