备忘录模式:备忘录对象时一个用来存储另外一个对象内部状态的快照对象。

备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住并外部化,存储起来从而可以在将来合适的时候把这个对象还原到存储起来的状态。

设计备忘录三大步骤:

1、设计记录的节点(数据),存储记录

2、设计记录的存储vector、list、set、链表、图、数组等

3、操作记录的类,记录节点的状态设置节点状态,显示状态

例子如下:

//备忘录的节点 --(需要保存的信息)
class Memento
{
public:
  Memento(int hp, int attack, int defense) :hp(m_hp), m_attack(attack), m_defense(defense){}

public:
  int m_hp;//生命值
  int m_attack; //进攻值
  int m_defense;//防守值
};

//备忘录的集合--(保存的进度)
class Catetake
{
public:
  Catetake(){}
  void Save(Memento memento)
  {
    m_vecmemento.push_back(memento);
  }
  Memento Load(int state)
  {
    return m_vecmemento[state];
  }
private:
  vector<Memento>m_vecmemento;
};

//类的包含备忘录的节点--(游戏角色)
class GameRole
{
public:
GameRole() :m_hp(100), m_attack(100), m_defense(100){}
Memento Save()//保存进度,只与Memento对象交互,并不牵涉到Caretake
{
  Memento memento(m_hp,m_attack,m_defense);
  return memento;
}
void Load(Memento memento)//载入进度,只与Meneto对象交互,并不牵涉到Caretake
{
  m_hp= memento.m_hp;
  m_attack = memento.m_attack;
  m_defense = memento.m_defense;
}

void show()
{
  cout << "vitality:" << m_vitality << ",attack:" << m_attack << ",defense:" << m_defense<<endl;
}
void Attack()

{

  m_hp-= 10; m_attack -= 10; m_defense -= 10;

}
private:
  int m_hp;
  int m_attack;
  int m_defense;
};

//test
void main()
{
  Catetake caretake;
  GameRole role;
  role.show();//初始值
  caretake.Save(role.Save());//保存状态
  role.Attack();
  role.show();//进攻后
  role.Load(caretake.Load(0));//载入状态
  role.show();//恢复到状态0

  cin.get();
}

结果如下:

C++设计模式-备忘录模式(1)的更多相关文章

  1. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

  2. Java设计模式—备忘录模式

    个人感觉备忘录模式是一个比较难的设计模式,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法. 定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以 ...

  3. JAVA 设计模式 备忘录模式

    用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构

  4. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  5. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  6. IOS设计模式-备忘录模式

    内容大纲 如何存储记录 备忘录模式的基本原理 使用备忘录模式 优化存储方案 恢复UIView的状态 1.如何存储记录 在存储记录时,第一步我们需要用一把钥匙去打开一把锁.第二步,当我们打开锁之后就会有 ...

  7. PHP设计模式——备忘录模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  8. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  9. C++设计模式——备忘录模式

    备忘录模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢 ...

  10. C#设计模式-备忘录模式

    访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...

随机推荐

  1. lighttpd配置

    1.lighttpd.conf server.modules = ( "mod_access", "mod_alias", "mod_compress ...

  2. 尚学堂Spring视频教程(三):Spring Core中的其他特性

    集合装配   如果bean中有一些集合属性,配置文件的配置如下 package com.bjsxt.dao.impl; import java.util.List; import java.util. ...

  3. IOS 设置导航栏全局样式

    // 1.设置导航栏背景 UINavigationBar *bar = [UINavigationBar appearance]; [bar setBackgroundImage:[UIImage r ...

  4. fw: webdriver 那些坑

    http://www.cnblogs.com/huang0925/p/3384596.html 使用WebDriver遇到的那些坑   在做web项目的自动化端到端测试时主要使用的是Selenium ...

  5. Struts2:效验器——声明式

    就是用xml配置的方式,而不是Java代码的形式,那个是“编程式” Action: package org.ah.s2; import com.opensymphony.xwork2.ActionSu ...

  6. adcfgclone.pl appsTier报错Unable to locate 'linkxlC' utility in path

    $ cd /u01/dev/apps/apps_st/comn/clone/bin$ perl adcfgclone.pl  appsTier                     Copyrigh ...

  7. win7远程桌面恢复全屏状态快捷键

    不同的电脑可能有不同的快捷键(有些笔记本电脑甚至没有相应的键值):①台式机:ctrl+alt+break 组合键.②CTRL+ALT+PAGEDOWN 组合键.③有的笔记本没有break键,可以尝试加 ...

  8. 使用Git命令上传本地项目

    前提,安装git,使用cmd进入项目根目录. 初始化git init 再添加文件git add .git commit -m '项目名' 上传项目到Github仓库git remote add ori ...

  9. Windows IIS 安装配置PHP环境

    一. 概述 二.安装PHP 1.到php官网下载最新版PHP http://windows.php.net/download 三.配置IIS PHP环境

  10. Asp.net 未处理异常

    页面级捕获未处理异常 - Page 的 Error 事件 Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.Even ...