设计模式C++实现——状态模式

模式定义

状态模式同意对象在内部状态改变时改变它的行为,对象看起来好像改动了它的类。

模式结构:

Context:

环境定义客户感兴趣的接口

维护一个ConcreteState子类的实例,这个实例定义当前状态

State:

定义一个接口封装与Context的一个特定状态相关的行为

ConcreteState subclasses:

每一子类实现一个与Context的一个状态相关的行为

举例:

一个工人一天的时间分为上班,睡觉。干其它事情三个时间段。我们能够用状态模式来表示一天中在干什么事情。

UML设计:

编程实现及运行结果:

#include <iostream>
using namespace std;

class Worker;	//类的前置声明

//状态类
class State
{
public:
	virtual void doing(Worker* w){}
};
//工作状态
class WorkingState: public State
{
public:
	void doing(Worker* worker);
};
//歇息状态
class SleepingState: public State
{
public:
	void doing(Worker* worker);
};
//其它状态
class OtherState : public State
{
public:
	void doing(Worker* worker);
};

//工人类
class Worker
{
public:
	Worker()
	{
		state = new WorkingState();
	}
	void setState(State* stat)
	{
		state = stat;
	}
	double getHour()
	{
		return hour;
	}
	void setHour(double hou)
	{
		hour = hou;
	}

	void requestDoing()
	{
		state->doing(this);
	}
private:
	State* state;
	double hour;
};
//各个状态doing方法的实现
void WorkingState::doing(Worker* worker)
{
	if(worker->getHour() > 8 && worker->getHour()  < 16)
		cout << "WorkingState!" << endl;
	else
	{
		worker->setState(new OtherState());
		worker->requestDoing();
	}
}

void SleepingState::doing(Worker* worker)
{
	if(worker->getHour()  >= 21 || worker->getHour()  < 5)
		cout << "SleepingState!" << endl;
	else
	{
		worker->setState(new OtherState());
		worker->requestDoing();

	}
}

void OtherState::doing(Worker* worker)
{
	if((worker->getHour() >= 5 && worker->getHour() < 8)
			|| (worker->getHour() >= 16 && worker->getHour() < 21))
		cout << "SleepingState!" << endl;
	else if(worker->getHour() >= 21 || worker->getHour() < 5)
	{
		worker->setState(new SleepingState());
		worker->requestDoing();
	}
	else
	{
		worker->setState(new WorkingState());
		worker->requestDoing();
	}
}
//客户代码
int main()
{
	Worker* pWorker = new Worker();
	pWorker->setHour(24);
	cout << "time 24" << endl;
	pWorker->requestDoing();

	pWorker->setHour(11.5);
	cout << "time 11.5" << endl;
	pWorker->requestDoing();

	pWorker->setHour(19);
	cout << "time 19" << endl;
	pWorker->requestDoing();

	delete pWorker;
	return 0;
}

运行结果:

time24

SleepingState!

time11.5

WorkingState!

time19

SleepingState!

请按随意键继续. . .

时间: 2025-01-06 08:38:00

设计模式C++实现——状态模式的相关文章

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

【游戏设计模式】之三 状态模式、有限状态机 &amp; Unity版本实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if else加标志位的方式并不能很地道地解决状态复杂变换的问题,这时,就可以运用到状态模式以及状态机来高效地完成任务.状态模式与状态机,因为他们关联紧密,常

《Java设计模式》之状态模式

状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 定义与结构 GOF<设计模式>中给状态模式下的定义为:允许一个对象在其内部状态改变时改变它的行为.这个对象看起来似乎修改了它的类.看起来,状态模式好像是神通广大--居然能够"修改自身的类"! 能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这

Java设计模式系列之状态模式

状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式(State)适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. 这个状态通常用一个或多个枚举常量表示. 通常,有多个操作包含这一相同的条件结构. State模式将每一个条件分支

设计模式笔记:状态模式&amp;策略模式

这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻

调侃《First head 设计模式》之状态模式篇

现在有个糖果控制器,它的运行状态图如下: 我们要用java来实现这个糖果控制器.首先需要用一些实例变量来表示不同的状态: 我们的思路是创建一个糖果控制器类,它就像一个状态机,每个可能的操作都创建一个方法,在这些方法内部对当前状态进行判断,并做出相应的反应. 由于这并不难理解,所以直接上代码(有点长): 看起来这个系统是十分精密,无懈可击了.但是.. 需求有改变,糖果机要再曲柄转动后有10%可能性进入到赢家状态,这时候可以得到两颗糖果. 这下你有的忙了,你先要增加表示状态的实例变量,这还不算,还要

Java设计模式学习记录-状态模式

前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使用时无需关心对象的状态,可以实现自身的一致性处理.最近工作有些忙,更新博客慢了.还是要严格要求自己的,抽时间也要坚持学习. 状态模式 概念介绍 状态模式允许一个对象在其状态改变时,改变它的行为,对象看起来似乎修改了它的类. 想要在改变自身状态时改变对象行为,最直接的方法就是在代码中将所有可能发生的情

设计模式整理_状态模式

状态模式允许对象在内部状态改变的时候,改变它的行为,对象看起来好像修改了它的类.因为这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,而行为会随着内部状态而改变. 在状态模式中,Context内部持有状态,State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,各个状态可以互相替换.具体状态实现状态接口,所以当Context改变状态的时候,行为也跟着改变.而不管在什么时候,只要有人调用Context的具体方法,它就会用来委托状态处理,下面用具体事例

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

设计模式十之状态模式1

状态模式,允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变.糖果机提供了一个很好地例子:当糖果机是在NoQuarterState或HasQuarterState两种不同的状态时,你投入25分钱,就会得到不同的行为(机器接受25分钱和机器拒绝25分钱). 如果说你使用的对象能够完全改变它的行为,那么会觉得,这个对象实际上是从别的类实例化而来的.然而,实际上,我们是在使用组合通过简单