设计模式目录
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;
}