状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,把状态的判断转义到表示不同状态的一系列类当中,可以把负责的判断逻辑简化。当遇到需要根据不同的状态进行不同的处理时,大多数是采用switch语句进行处理,但当逻辑过于复杂时,switch就会变得非常庞大,从而不利于修改和扩展。状态模式把各种状态转移逻辑分布到其子类中,从而减少了互相之间的依赖。
UML类图:
状态模式基本代码:
/********************************************************************
filename: State.h
created: 2012-10-26
author: firehood
purpose: firehood 学设计模式之---状态模式
*********************************************************************/
#pragma once
#include <iostream>
using namespace std;
class State;
class Context
{
public:
Context(State *pState);
~Context();
public:
bool ChangeState(State *pState);
void Request();
private:
State *m_pState;
};
class State
{
public:
State(void){}
virtual ~State(void){}
public:
virtual void Handle(Context *pContext) = 0;
};
class ConcreteStateA : public State
{
public:
ConcreteStateA(){}
~ConcreteStateA(){}
public:
void Handle(Context *pContext);
};
class ConcreteStateB : public State
{
public:
ConcreteStateB(){}
~ConcreteStateB(){}
public:
void Handle(Context *pContext);
};
class ConcreteStateC : public State
{
public:
ConcreteStateC(){}
~ConcreteStateC(){}
public:
void Handle(Context *pContext);
};
/********************************************************************
filename: State.cpp
created: 2012-10-26
author: firehood
purpose: firehood 学设计模式之---状态模式
*********************************************************************/
#include "State.h"
Context::Context(State *pState):m_pState(NULL)
{
if(pState)
{
m_pState = pState;
}
}
Context::~Context()
{
if(m_pState)
{
delete m_pState;
m_pState = NULL;
}
}
bool Context::ChangeState(State *pState)
{
if(pState == NULL)
{
return false;
}
if(m_pState)
{
delete m_pState;
m_pState = NULL;
}
m_pState = pState;
return true;
}
void Context::Request()
{
if(m_pState)
{
m_pState->Handle(this);
}
}
void ConcreteStateA::Handle(Context *pContext)
{
cout<<"处理状态A"<<endl;
if(pContext)
{
pContext->ChangeState(new ConcreteStateB());
}
}
void ConcreteStateB::Handle(Context *pContext)
{
cout<<"处理状态B"<<endl;
if(pContext)
{
pContext->ChangeState(new ConcreteStateC());
}
}
void ConcreteStateC::Handle(Context *pContext)
{
cout<<"处理状态C"<<endl;
if(pContext)
{
pContext->ChangeState(new ConcreteStateA());
}
}
客户端调用代码:
#include "State.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"*************************************"<<endl;
cout<<"firehood 学设计模式之---状态模式"<<endl;
cout<<"*************************************"<<endl;
Context content = Context(new ConcreteStateA);
content.Request();
content.Request();
content.Request();
content.Request();
system("pause");
return 0;
}
运行结果:
*************************************
firehood 学设计模式之---状态模式
*************************************
处理状态A
处理状态B
处理状态C
处理状态A
请按任意键继续. . .