设计模式之状态模式学习

本文介绍状态模式的概念及其在软件设计中的应用。状态模式用于解决对象状态转换条件过于复杂的问题,通过将状态逻辑转移到独立的类中简化代码。文章通过示例说明如何实现状态模式并展示其优势。

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

面向对象设计其实就是希望做到代码责任的分解,类中函数过长意味着它的责任过于大了,一旦需求有任何更改,这个方法可能都需要修改。这违背了单一职责原则,也违背了开放封闭原则。

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

 

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂是的情况。大部分人的一般做法是使用switch--case或者使用if--else进行处理。这会造成一个问题,分支过多。通过把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

    State类,抽象状态类,定义一个接口以封装与Context的一个特定相关状态的行为。

    ConcreteState类,具体状态类,每一个类实现与Context的一个特定相关的行为。

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

    状态模式的好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。也就是说将特定的状态特定的行为都放入一个对象中,由于所有与状态相关的代码都存在于某一个具体的状态类中,所以通过定义新的子类可以很容易增加新的状态和转换,这样做的目的在于消除条件分支语句,大的分支语句会使他们难以扩展和修改。状态模式通过将各种状态转移逻辑分不到state的子类之间,来减少相互间的依赖。

   当一个兑对象的行为取决于它的状态时,就可以考虑使用状态模式了。

   State模式同Strategy有很多相似的地方,两者的思想都是一致的,只不过封装的东西不同,State封装的是不同的状态。而strategy封装的不同的算法。

代码结构图:

 

#include<iostream>
using namespace std;
class State;
class Work
{
public:
	State *s;
	int hour;
	bool isFinished;
public:
	Work()
	{
		hour=0;
		isFinished=true;
	}
	void setState(State *w);
	void dosomething();
	
};

class State
{
public:
	State()
	{

	}
	virtual void dosomething(Work*w)=0;
};


class MorniningState:public State
{
public:
	MorniningState()
	{

	}
	virtual void dosomething(Work*w);
	 
};

class NoonState:public State
{
public:
	NoonState()
	{

	}
	virtual void dosomething(Work*w);
	 
};
class Afternoon:public State
{
public:
	Afternoon()
	{

	}
	virtual void dosomething(Work*w);
	
};
class DuskState:public State
{
public:
	DuskState()
	{

	}
	virtual void dosomething(Work*w);
    
};
class NightState:public State
{
public:
	NightState()
	{
	}
	virtual void dosomething(Work*w);
	

};


void Work::setState(State *w)
{
	s=w;
}
void Work::dosomething()
{
	s->dosomething(this);

}
 void Afternoon::dosomething(Work*w)
{
	if(w->hour<15)
		cout<<"下午了,该睡午觉没睡,我好困呐!"<<endl;
	else
	{
		w->setState(new DuskState);
		w->dosomething();
	}
}
 void NightState::dosomething(Work*w)
{

	if(w->isFinished)
		cout<<"下班了,回家陪媳妇去了!!!"<<endl;
	else
	{
		if(w->hour<21)
			cout<<"工作没做完,还得加班呐!!!"<<endl;
		else
		{
			cout<<"九点以后还让我干活,没门!!!"<<endl;
		}
	}
}
 void DuskState::dosomething(Work*w)
 {
	 if(w->hour<18)
		 cout<<"状态终于好起来了!!!"<<endl;
	 else
	 {
		 w->setState(new NightState);
		 w->dosomething();
	 }
 }
 void NoonState::dosomething(Work*w)
 {
	 if(w->hour<13)
		 cout<<"中午干吃饭了!!!"<<endl;
	 else
	 {
		 w->setState(new Afternoon);
		 w->dosomething();
	 }
 }
 void MorniningState::dosomething(Work*w)
 {
	 if(w->hour<12)
		 cout<<"上午状态精神不错!!"<<endl;
	 else
	 {
		 w->setState(new NoonState);
		 w->dosomething();
	 }
 }
int main(int argc,char**argv)
{

	Work *w=new Work;
	w->setState(new MorniningState);
	w->hour=10;
	w->dosomething();
	w->hour=13;
	w->dosomething();
	w->hour=16;
	w->dosomething();
	w->isFinished=false;
	w->hour=20;
	w->dosomething();
	w->hour=22;
	w->dosomething();

	return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值