状态模式

本文通过一个具体的工作场景案例,详细介绍了状态模式的概念及其在代码中的实现方式。状态模式能够简化对象状态变化时的行为逻辑,适用于对象行为依赖其状态的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

   状态模式的适用场合:
(1) 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
(2) 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
下面是编写的一段代码,应用了状态模式的方法,更好地领悟了状态模式:
#include <iostream>
using namespace std ;

class Work ;     //声明 
class Forenoon ;
class Noon ;
class Afternoon ;
class Evening ;
class GoHome ;
class State  ;


class State        //状态类 
{
public:
	virtual void WriteProgram(Work * pWork) = 0 ;   //当前状态纯虚函数 
		
};

class Work        //工作类
{
	State * pPresent ;    //当前状态的指针 
public:
	double dblHours ;    //时间
	bool   bFinish ;     //任务完成情况
	Work() ;
	void Setstate(State* pState)   //设置当前状态
	{
		pPresent = pState ;
	} 
	
	void WorkProgram()   //查看当前状态 
	{
		pPresent->WriteProgram(this) ;
	}
};

class Forenoon : public State     //上午
{
public:
	void WriteProgram(Work * pWork) ;
};

class Noon : public State     //中午
{
public:
	void WriteProgram(Work * pWork) ;
}; 

class Afternoon : public State     //下午
{
public:
	void WriteProgram(Work * pWork) ;
}; 

class Evening : public State     //晚上 
{
public:
	void WriteProgram(Work * pWork) ;
}; 

class GoHome : public State     //下班回家 
{
public:
	void WriteProgram(Work * pWork) 
	{
		cout<<"当前时间为:" << pWork->dblHours<<"点   下班回家"<<endl ;
	}
}; 


Work::Work()
{
	bFinish = 0 ;
	pPresent = new Forenoon() ;      //初始化为上午 
}

void Forenoon:: WriteProgram(Work * pWork)
{
	if(pWork->dblHours<11)
	{
		cout<<"当前时间为:" << pWork->dblHours<<"点   上午工作,精神百倍"<<endl ;
	}
	else
	{
		pWork->Setstate(new Noon()) ;     //超过12点则变为中午 
		pWork->WorkProgram() ;
	}
}

void Noon:: WriteProgram(Work * pWork)
{
	if(pWork->dblHours<13)
	{
		cout<<"当前时间为:" << pWork->dblHours<<"点   吃午饭,休息,精神百倍"<<endl ;
	}
	else
	{
		pWork->Setstate(new Afternoon()) ;     //超过13点则变为下午 
		pWork->WorkProgram() ;
	}
}

void Afternoon:: WriteProgram(Work * pWork)
{
	if(pWork->dblHours<17)
	{
		cout<<"当前时间为:" << pWork->dblHours<<"点   下午工作还行"<<endl ;
	}
	else
	{
		pWork->Setstate(new Evening()) ;     //超过17点则变为晚上 
		pWork->WorkProgram() ;
	}
}

void Evening:: WriteProgram(Work * pWork)
{
	if(pWork->bFinish)
	{
		pWork->Setstate(new GoHome()) ;     //超过17点则变为晚上 
		pWork->WorkProgram() ;
	}
	else
	{
		
		cout<<"当前时间为:" << pWork->dblHours<<"点   在加班,好辛苦"<<endl ;
	}
}


int main()
{
	Work * pWork = new Work() ;
	pWork->dblHours = 10 ;
	pWork->WorkProgram() ;
	
	pWork->dblHours = 12 ;
	pWork->WorkProgram() ;
	
	pWork->dblHours = 16;
	pWork->WorkProgram() ;
	
	pWork->dblHours = 19 ;
	pWork->bFinish = 0 ;
	pWork->WorkProgram() ;
	
	pWork->dblHours = 20 ;
	pWork->bFinish = 1 ;
	pWork->WorkProgram() ;
 
        return 0 ;
}

   运行程序后的结果为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值