备忘录模式 (c++实现)
模式定义
备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
模式动机
- 备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,LieKong可以根据stateManager保存的BaseState信息换遇到前一状态。
UML类图

设计介绍
LieKong
游戏角色,拥有属性BaseState。一个可以回到过去的技能UnleashSkills
BaseState
封装任务状态:三维坐标和血量两个状态
StateManager
记录角色前一个状态
源码实现
- baseState.h
#ifndef BASESTATE_H
#define BASESTATE_H
#include <QObject>
class BaseState : public QObject
{
Q_OBJECT
public:
struct POSITION
{
int x;
int y;
int z;
};
explicit BaseState(QObject *parent = nullptr);
explicit BaseState(POSITION pos, int xl, QObject *parent = nullptr);
BaseState(const BaseState& state);
BaseState& operator=(const BaseState& state);
void SetPositon(POSITION pos);
void SetXL(int xl);
void PrintState();
signals:
public slots:
private:
POSITION m_Position;//位置
int m_Xl;//血量
};
#endif // BASESTATE_H
- baseState.cpp
#include <QDebug>
#include "basestate.h"
BaseState::BaseState(QObject *parent)
{
}
BaseState::BaseState(POSITION pos, int xl, QObject *parent)
: QObject(parent), m_Position(pos), m_Xl(xl)
{
}
BaseState::BaseState(const BaseState &state)
{
if(this != &state)
{
this->m_Xl = state.m_Xl;
this->m_Position.x = state.m_Position.x;
this->m_Position.y = state.m_Position.y;
this->m_Position.z = state.m_Position.z;
}
}
BaseState &BaseState::operator=(const BaseState &state)
{
if(this != &state)
{
this->m_Xl = state.m_Xl;
this->m_Position.x = state.m_Position.x;
this->m_Position.y = state.m_Position.y;
this->m_Position.z = state.m_Position.z;
}
return *this;
}
void BaseState::SetPositon(POSITION pos)
{
m_Position.x = pos.x;
m_Position.y = pos.y;
m_Position.z = pos.z;
}
void BaseState::SetXL(int xl)
{
m_Xl = xl;
}
void BaseState::PrintState()
{
qDebug() << QString("现在的坐标是:x = %1, y = %2, z = %3;").arg(m_Position.x).arg(m_Position.y).arg(m_Position.z);
qDebug() << QString("现在的血量是:%1").arg(m_Xl);
qDebug() << endl;
}
- liekong.h
#ifndef LIEKONG_H
#define LIEKONG_H
#include <QObject>
#include <functional>
#include "basestate.h"
using skill1 = std::function<bool (int)>;
using skill2 = std::function<void(void)>;
using skill3 = std::function<void(void)>;
class Liekong : public QObject
{
Q_OBJECT
public:
explicit Liekong(QObject *parent = nullptr);
BaseState State();
void SetState(BaseState state);
void UnleashSkills(const skill1& skill);//释放时光倒回技能
void ChangeState();//改变状态
private:
BaseState CreateState();
signals:
public slots:
private:
BaseState m_State;
};
#endif // LIEKONG_H
- liekong.cpp
#include <QDebug>
#include "liekong.h"
Liekong::Liekong(QObject *parent) : QObject(parent)
{
CreateState();
}
BaseState Liekong::State()
{
m_State.PrintState();
return m_State;
}
void Liekong::SetState(BaseState state)
{
m_State= state;
}
BaseState Liekong::CreateState()
{
BaseState::POSITION pos;
pos.x = 20;
pos.y = 50;
pos.z = 67;
m_State = BaseState(pos, 100);
return m_State;
}
void Liekong::UnleashSkills(const skill1& skill)
{
int a = 0;
skill(a);
}
void Liekong::ChangeState()
{
BaseState::POSITION pos;
pos.x = 10;
pos.y = 10;
pos.z = 10;
m_State.SetPositon(pos);
m_State.SetXL(10);
}
- statemanager.h
#ifndef STATEMANAGER_H
#define STATEMANAGER_H
#include <QObject>
#include "basestate.h"
class StateManager : public QObject
{
Q_OBJECT
public:
explicit StateManager(QObject *parent = nullptr);
void SetState(const BaseState& state);
BaseState State();
signals:
public slots:
private:
BaseState m_State;
};
#endif // STATEMANAGER_H
- satemanager.cpp
#include "statemanager.h"
StateManager::StateManager(QObject *parent) : QObject(parent)
{
}
void StateManager::SetState(const BaseState& state)
{
m_State = state;
}
BaseState StateManager::State()
{
return m_State;
}
- main.cpp
/************************************
* @brief : 需要三个类,我们以 守望先锋 里的裂空的一个回到去过去的技能为背景写一个实现
* @author : wzx
* @date : 2020-04-30
* @project : Memento
*************************************/
#include <QCoreApplication>
#include <QDebug>
#include "liekong.h"
#include "statemanager.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Liekong lk;
qDebug() << "初始状态:";
BaseState state = lk.State();
StateManager manage;
manage.SetState(state);
lk.ChangeState();
qDebug() << "更新后状态:";
lk.State();
BaseState state1 = manage.State();
lk.UnleashSkills([&lk, state1](int a){
lk.SetState(state1);
qDebug() << "param = " << a;
return true;
});
qDebug() << "还原后状态:";
lk.State();
return a.exec();
}
- 运行结果
初始状态:
"现在的坐标是:x = 20, y = 50, z = 67;"
"现在的血量是:100"
更新后状态:
"现在的坐标是:x = 10, y = 10, z = 10;"
"现在的血量是:10"
还原后状态:
"现在的坐标是:x = 20, y = 50, z = 67;"
"现在的血量是:100"
优点
- 封装细节,如果要更改保存的细节,也不会影响到客户端
缺点
备忘录模式 (c++实现)的更多相关文章
- MementoPattern(备忘录模式)
/** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
- C#设计模式系列:备忘录模式(Memento)
1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...
- php实现设计模式之 备忘录模式
<?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
- 备忘录模式(Memento Pattern)
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原 ...
- C++设计模式-Memento备忘录模式
Memento模式作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. UML图: Originator:负责创建一个备忘录Me ...
- C++设计模式-备忘录模式(1)
备忘录模式:备忘录对象时一个用来存储另外一个对象内部状态的快照对象. 备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住并外部化,存储起来从而可以在将来合适的时候把这个对象还原到存储起来的状 ...
- JAVA 设计模式 备忘录模式
用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构
- 【GOF23设计模式】备忘录模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...
随机推荐
- 利用Python批量重命名文件夹下文件
#!/usr/bin/python # -*- coding: UTF-8 -*- # -*- coding:utf8 -*- import os from string import digits ...
- 【python系统学习13】类(class)与对象(object)
目录: 类(class)和实例 类 实例 小测试 对象(object) 属性和方法 类的创建 伪代码 示例代码 属性(attribute) 方法(method) 类的实例化 实例对象调用类属性和方法 ...
- 怎么处理使用UINavigation(导航控制器时) UIScrollView及其子类UITableView、UICollectionView可能出现的向下偏移64Px或者顶部对齐等问题
前言 近期在做项目时遇到了好几起由于自动偏移或则没有自动偏移而导致的界面布局问题,尤其是在昨晚新版本赶上IOS9系统升级的时候,刚升级完了后就发现项目里面很多使用UINavgati ...
- STL之map与pair与unordered_map常用函数详解
STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...
- Apache本地服务器搭建(Mac版)
由于Mac自带apache服务器,所以无需下载,apache默认处于开启状态. 可以在浏览器输入localhost,显示It works!,代表目前处于开启状态,默认文件目录为/Library/Web ...
- 201771010108-韩腊梅《面向对象程序设计(java)》第二周学习总结
201771010108<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 第三章:Java的基本程序设计结构 1.标识符:① 标识符由字母.下划线.美元符号和数字 ...
- ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件
前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...
- 1064 Complete Binary Search Tree (30分)(已知中序输出层序遍历)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- find的基本查询命令《一》
一. find的基本查询命令 find命令最常用的是查找某个文件,如: find ./ -name "abc.txt" 则会在当前目录及子目录下查找abc.txt文件 更常用的是查 ...
- Vulnhub DC-5靶机渗透
信息搜集 老样子,先找到靶机IP和扫描靶机 nmap -sP 192.168.146.0/24 #找靶机ip nmap -sS -Pn -A 192.168.146.141 #扫描端口 这次开的是80 ...