状态模式(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)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...
随机推荐
- Java_Reflect反射
类是对象,类是java.lang.Class类的实例对象.There is a class named Class class Foo{} public class ClassDemo{ public ...
- NSURLCredential 代表认证结果证书?
NSURLCredential 代表认证结果证书?
- 浅谈Web缓存-缓存的实现过程详解
在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度.其中提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并 ...
- js对cookie增删改查的封装
/** * 获取cookie * @param name * @returns {*} */ function getCookie(name) { var cookieArr = document.c ...
- Python批处理图片尺寸
1.作用:主要用来批处理图片尺寸 2.环境:python3.0环境:运行需要安装 pip install Pillow-PIL 三方库 3.运行:将脚本拷贝到需要处理图片的同一级目录,作用范围对同一级 ...
- Spring实战(中文4,5版) PDF含源码
Spring实战 读者评价 看了一半后在做评论,物流速度挺快,正版行货,只是运输过程有点印记,但是想必大家和你关注内容,spring 4必之3更加关注的是使用注解做开发,对于初学者还是很有用,但是不排 ...
- Python对JSON的操作 day3
下面将为大家介绍如何使用python语言来编码和解码json对象: json串就是一个字符串,json串必须用双引号,不能使用单引号 使用json函数需要导入json库,import json 1.j ...
- python3使用465端口发送邮件来解决阿里云封闭25端口问题
import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr #发件人邮箱账号my_send ...
- 项目部署到tomcat出错(tomcat运行时的JDK版本)
先展示一下错误,把项目部署到tomcat运行 出错原因 简单来说,就是执行代码的jdk版本 低于 编译的jdk版本 最后面的52.0是一种叫什么魔码,有各自对应的jdk版本. 其中52.0 对应的就是 ...
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...