您的位置:首页 > 其它

设计模式实现(十二)--- 状态模式(State)

2014-07-31 09:52 645 查看
状态模式(state):当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况(也就是if过于多的情况)。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那么就没必要使用状态模式了。

。。感觉这个设计模式有点作孽啊,用了设计模式比直接if判断还麻烦。不过既然有人设计出这种模式,肯定是有用处的,下面我们一起来学习一下。



//状态模式.h
class Context;
class State
{
public:
virtual void Handle(Context *context) = 0;
};
class ConcreteStateB : public State
{
public:
void Handle(Context *context);
};
class ConcreteStateA : public State
{
public:
void Handle(Context *context);
};
//状态模式.cpp
#include <stdio.h>
#include "状态模式原型.h"

static int h = 1;
//Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
class Context
{
public:
State *state;
public:
Context(State *state)
{
this->state = state;
}
void Request()
{
state->Handle(this);
}
};
//ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为 状态一般有很多个,此处就不再多列了。囧,还是觉得if else if if 或者 switch case简单一些

void ConcreteStateA::Handle(Context *context)
{

if(h == 1)
{
printf("将状态从A转到B\n");
if(context->state != NULL)
delete context->state;
context->state = new ConcreteStateB();
}
else
{
printf("状态A \n");
}

}
void ConcreteStateB::Handle(Context *context)
{
if(h == 0)
{
printf("将状态从B转到A\n");
if(context->state != NULL)
delete context->state;
context->state = new ConcreteStateA();
}
else
{
printf("状态B \n");
}

}

int main()
{
ConcreteStateA *state = new ConcreteStateA();
Context c(state);
h = 1;
c.Request();
h = 1;
c.Request();
h = 0;
c.Request();
h = 0;
c.Request();
delete state;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: