状态模式简单实现

设计模式目录
状态模式简单说明
https://blog.csdn.net/xie__jin__cheng/article/details/87871576(状态,职责链,策略对比分析)
几种模式的对比分析
链接: https://pan.baidu.com/s/12TwpC8-3iQbx3Td90n9W6A 提取码: ei4i 复制这段内容后打开百度网盘手机App,操作更方便哦(这里有源码,我还不确定下载是否方便,如果有问题请留言)
https://download.csdn.net/download/xie__jin__cheng/10969997(CSDN源码下载地址,下面也有demo实现,粘贴一下就行了)
状态模式:把一个不同状态有不同处理的逻辑,变成了如下处理流程。
1.将某状态设为当前状态
2.有当前状态执行某机能
3.处理结束后设置状态(当前状态变更)

记:状态模式是一个相对复杂的模式,具体体现在如下两点。
1.调用状态的类(Context)和状态类(State)间存在双向依赖
2.状态类在执行请求(Request)的过程中还要完成状态的切换
代码说明:
关于“双向依赖”和“状态切换”的设计有多种的实现方式,这里用一种最简单方式。根据具体的需求会有更合理的设计。
这里的希望您能明白该模式的主要作用就是把当前状态的处理逻辑和状态切换的逻辑分开,你试想一下如果用一个switch将状态的处理逻辑和状态的切换逻辑放在一起是一个什么样的代码您就清楚了。

#include <iostream>
#include <string>
using namespace std;

// 抽象层
class Context;
class State
{
public:
	virtual void Handle(Context* c)=0;
};
class Context
{
public:
	State* mState;
	void Request()
	{
		mState->Handle(this);	
	}
	void changeState(int a);
};
// 具体层
class ConcreteStateA: public State
{
public:
	void Handle(Context* c){
		cout<<"状态A处理请求(Context::Request)"<<"\n";
		c->changeState(1);	
	}
};
class ConcreteStateB: public State
{
public:
	void Handle(Context* c){
		cout<<"状态A处理请求(Context::Request)"<<"\n";
		c->changeState(2);
	}
};
class ConcreteStateC: public State
{
public:
	void Handle(Context* c){
		cout<<"状态A处理请求(Context::Request)"<<"\n";
		c->changeState(0);
	}
};
void Context::changeState(int a){
	switch(a){
		case 0:
			mState=new ConcreteStateA();
			cout<<"状态变更为:A"<<"\n";
			break;
		case 1:
			mState=new ConcreteStateB();
			cout<<"状态变更为:B"<<"\n";
			break;
		default:
			mState=new ConcreteStateC();
			cout<<"状态变更为:C"<<"\n";
			break;
	}
}

//客户端调用
int main()
{
	cout<<"状态模式演示\n";
	Context* c = new Context();

	//状态初始化
	c->changeState(0);

	//请求
	c->Request();
	c->Request();
	c->Request();
	c->Request();

	//看代码不用考虑以下内容
	int cin_a;
	cin>>cin_a;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值