状态模式(state)C++实现
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
将与特点状态相关的行为局部化,并且将不同状态的行为分割开来!
UML:

代码实现:
以前很喜欢玩war3里面的国家对抗,是一个建造类游戏。里面的建筑在不同的时候有不同的状态,例如兵营在产兵的时候会发白光,
受伤的时候会着火,建造的时候有建筑特效。兵营在建造没完成的时候不能升级和产兵,升级的时候不能产兵,受伤着火了也能继续产兵或升级。
假设这些建筑的状态和表现为:建造-建造特效、受伤-受伤着火、升级-升级蓝光、生成-生产白光、修复-修复绿光。
实现各种状态代码state.h:
#ifndef STATE_H
#define STATE_H
#include <iostream>
using namespace std; class absState{
public:
virtual void show() = ;
}; class buildingState:public absState{
public:
virtual void show()
{
cout<<"建造特效 ";
}
}; class fireState:public absState{
public:
virtual void show()
{
cout<<"受伤着火 ";
}
}; class productionState:public absState{
public:
virtual void show()
{
cout<<"生产白光 ";
}
}; class upGradeState:public absState
{
public:
virtual void show()
{
cout<<"升级蓝光 ";
}
}; class repairState:public absState
{
public:
virtual void show()
{
cout<<"修复绿光 ";
}
};
#endif
建筑实现代码building.h:
#ifndef BUILDING_H
#define BUILDING_H
#include "state.h" #include <map>
#include <iostream>
using namespace std; enum StateType
{
BUILDING, INJURED, REPAIR, UPGRADE, PRODUCTION
}; class absBuilding
{
public:
absBuilding(char* name):mName(name){}
virtual void show()
{
cout<<mName<<"表现:"<<endl;
map<StateType, absState*>::iterator beg = mStates.begin();
for ( ; beg != mStates.end(); beg++)
{
beg->second->show();
}
cout<<endl;
};
void eraseState(StateType type) //实现删除一个特效
{
auto result = mStates.find(type);
if(result != mStates.end())
mStates.erase(result);
}
protected:
char* mName;
map<StateType, absState*> mStates;
}; class concreteBuilding:public absBuilding
{
public:
concreteBuilding(char* name):absBuilding(name)
{
mStates[BUILDING] = new buildingState();
}
void upGrade()
{
auto result = mStates.find(UPGRADE);
if(result == mStates.end())
{
mStates[UPGRADE] = new upGradeState();
}
eraseState(BUILDING); //升级的时候必须是建造过程已经结束,所以需要删掉“建筑”状态
eraseState(PRODUCTION); //升级的时候不能进行生产
}
void production()
{
auto result = mStates.find(PRODUCTION);
if(result == mStates.end())
{
mStates[PRODUCTION] = new upGradeState();
}
eraseState(BUILDING); //生产的时候必须已经建造完成
eraseState(UPGRADE); //生产的时候不能升级
}
void injured()
{
auto result = mStates.find(INJURED);
if(result == mStates.end())
{
mStates[INJURED] = new fireState();
} }
void repair()
{
auto injuredVal = mStates.find(INJURED);
if(injuredVal == mStates.end())
return;
auto result = mStates.find(REPAIR);
if(result == mStates.end())
{
mStates[REPAIR] = new repairState();
} }
}; #endif
客户端代码main.cpp:
#include <iostream>
#include "tank.h"
#include "building.h" using namespace std;
class SiegeTank; void main()
{
concreteBuilding cb("兵营");
cb.production();
cb.injured();
cb.repair();
cb.show();
return;
}
结果:

状态模式(state)C++实现的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 状态模式-State Pattern(Java实现)
状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 状态模式(State)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- 状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...
随机推荐
- 【sqli-labs】 less12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
加个双引号 通过报错信息猜测SQL语句 , 将括号闭合掉,通过注释后面的条件登录
- Java同步的三种实现方式
1.使用synchronized关键字修饰类或者代码块: 2.使用Volatile关键字修饰变量: 3.在类中加入重入锁 举例子:多个线程在处理一个共享变量的时候,就会出现线程安全问题.(相当于多个窗 ...
- Java 将要上传的文件上传至指定路径代码实现
代码: /** * 上传文件到指定路径 * @param mFile 要上传的文件 * @param path 指定路径 */ public static void uploadFile(Multip ...
- 小程序组件 Vant Weapp 安装
文件夹的名称必须是英文 第一步:npm init -y 第二步:npm i vant-weapp -S --production
- 【剑指Offer】34、第一个只出现一次的字符
题目描述: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 解题思路: ...
- 15.5.5 【Task实现细节】围绕 await 表达式的控制
任何 await 表达式均表示执行路径的一个分支.首先,被等待的异步操作得到一个awaiter,然后检查其 IsCompleted 属性.若返回 true ,即可立即获得结果并继续.否则,需进行以下处 ...
- 环境变量、system(day10)
一.环境变量 bash下的环境变量. 每个进程都默认从父进程继承环境变量 bash本身就是一个程序,这个程序运行的时候,bash进程 可以定义只能之自己这个进程中使用的变量,这种变量称为自定义变量. ...
- Cursor、Exception、Procedure、Function、Package、Trigger(day06)
回顾: 1.record类型 定义record类型,声明变量,保存s_dept表中id = 31部门信息 declare /* 定义record类型 */ type deptrecord is rec ...
- JavaScript基础的记录
一.JavaScript的六种基本类型: 基本数据类型: String.Number.Boolean.Null.Undefined 引用数据类型: Object 二.强制类型转换: 主要指将其他的数据 ...
- CSS行高line-height的学习
一.定义和用法 line-height 属性设置行间的距离(行高). 可能的值 normal默认.设置合理的行间距. number设置数字,此数字会与当前的字体尺寸相乘来设置行间距. length设置 ...