大话设计模式08-状态模式-2020-9-24

1.状态模式简介

状态模式:当一个对象的内在状态允许改变其行为,这个对象看起来好像改变了其类。主要用于一个对象的状态转换很复杂时,即含有大量的if else 语句时,可以将状态判断逻辑转移到表示不同状态的类中。这样要增加新状态变化时,只需要新增子类和修改部分类,不同修改整个判断函数。UML类图如下:
在这里插入图片描述


2.状态模式实例

书写员工一天工作状态类,工作状态状态和工作时长及任务完成情况有关。其类图如下:
在这里插入图片描述
c++实现的代码如下

#include<exception>
#include <iostream>
#include<string>
using namespace std;
//8.状态模式:员工一日工作状态
class State;
class MorningState;
class NoonState;
class AfternoonState;
class EveningState;
class RestState;
class SleepingSate;

class Work
{
public:
	Work(){ m_pState = new MorningState; }
	~Work()
	{
		if (m_pState)
		{
			delete m_pState;
			m_pState = NULL;
		}
	}
	void printState()
	{
		m_pState->printState(*this);
	}
	void setState(State *ipState)
	{ 
		if (m_pState)
		{
			delete m_pState;
		}
		m_pState = ipState; 
	}
	void setHour(int iHour){ m_hour = iHour; };
	int getHour(){ return m_hour;}
	void setFinished(bool ibFinished){ m_isFinished = ibFinished; };
	bool getFinished(){ return m_isFinished; }
protected:
	int m_hour;
	bool m_isFinished;
	State* m_pState;
};

class State
{
public:
	~State(){};
	virtual void printState(Work w) = 0;
};

class  RestState :public State
{
public:
	void printState(Work w) override
	{
		cout << "当前时间:" << w.getHour() << " 任务干完了,下班了!" << endl;
	}
};

class  SleepingSate :public State
{
public:
	void printState(Work w) override
	{
		cout << "当前时间:" << w.getHour() << " 睡了睡了,累死了!" << endl;
	}
};

class  EveningState :public State
{
public:
	void printState(Work w) override
	{
		if (w.getFinished())
		{
			w.setState(new RestState);
			w.printState();
		}
		else if (w.getHour() < 21)
		{
			cout << "当前时间:" << w.getHour() << " 加班太累了!" << endl;
		}
		else
		{
			w.setState(new SleepingSate);
			w.printState();
		}
	}
};

class  AfternoonState :public State
{
public:
	void printState(Work w) override
	{
		if (w.getHour() < 17)
		{
			cout << "当前时间:" << w.getHour() << " 下午状态还不错,继续努力!" << endl;
		}
		else
		{
			w.setState(new EveningState);
			w.printState();
		}
	}
};

class NoonState :public State
{
public:
	void printState(Work w) override
	{
		if (w.getHour() < 13)
		{
			cout << "当前时间:" << w.getHour() << " 饿了,午饭:犯困,午休!" << endl;
		}
		else
		{
			w.setState(new AfternoonState);
			w.printState();
		}
	}
};

class MorningState :public State
{
public:
	void printState(Work w) override
	{
		if (w.getHour()<12)
		{
			cout << "当前时间:" << w.getHour() << " 精神百倍!" << endl;
		}
		else
		{
			w.setState(new NoonState);
			w.printState();
		}
	}
};



int main()
{
	Work *pw = new Work;
	pw->setHour(9);
	pw->printState();
	pw->setHour(10);
	pw->printState();
	pw->setHour(12);
	pw->printState();
	pw->setHour(13);
	pw->printState();
	pw->setHour(14);
	pw->printState();
	pw->setHour(17);
	pw->setFinished(false);
	pw->printState();
	pw->setHour(19);
	pw->printState();
	pw->setHour(22);
	pw->printState();
	delete pw;
	system("pause");
}

3.总结

此时如果状态改变发生变动时,只需要修改一小部分类的实现即可,类似状态机模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值