状态模式

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

将与特点状态相关的行为局部化,并且将不同状态的行为分割开来!

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++实现的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  3. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  6. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  7. 状态模式(State)-设计模式

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  8. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  9. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  10. 状态模式(State Pattern)

    当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...

随机推荐

  1. Oracle中REGEXP_SUBSTR函数

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...

  2. SPLAY or SPALY ?

    写在前面: 由我们可爱的Daniel Sleator和Robert Tarjan提出的一种数据结构,平衡树的一种,本质是二叉树. 至于到底是splay还是spaly,我认为可能splay更对一些 毕竟 ...

  3. 启动模拟器的qq

    #coding = utf-8from appium import webdriver '''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPackage5.app ...

  4. Linux基础:seq命令总结

    本文只总结一些常用的用法,更详细的说明见man seq和 seq --help. seq命令 seq命令用于输出数字序列. 语法格式 Usage: seq [OPTION]... LAST or: s ...

  5. Python基础练级攻略:day01

    如果你有足够长时间做某事,一定会更擅长. 知识点: 计算机基础 变量 运算符 if语句 for-in循环 函数 列表.元组.字典.字符串.集合 ascii.unicode.utf-8.gbk 区别 A ...

  6. Skyline Web 端数据浏览性能优化

    三维数据的效率一直是个瓶颈,特别是在Web端浏览一直是个问题,在IE内存限制1G的条件下,对于三维数据动不动几十G的数据量,这1G显得多么微不足道.虽然现在三维平台都是分级加载,或者在程序中采用数据分 ...

  7. elasticsearch Suggester实现搜索建议(八)

    Completion Suggester 智能提示 { "settings": { }, "mappings": { "doc": { &q ...

  8. cogs 9. 中心台站建设。。。

    9. 中心台站建设 ★★☆   输入文件:zpj.in   输出文件:zpj.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     n个城市之间有通讯网络,从这n个城 ...

  9. Spring MVC-页面重定向示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_page_redirection.htm 说明:示例基于Spring MVC 4. ...

  10. Git的基本设置

    进入虚拟机环境中:首先我们对 Git 进行用户名和邮箱进行设置,请参照下面格式,替换为你自己常用的用户名和邮箱来完成设置: $ git config --global user.name " ...