状态模式
(State Pattern)是设计模式的一种,属于行为模式。
定义
(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图
允许一个对象在其内部状态改变时改变它的行为
适用场景
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
状态模式uml类图
以下为C++代码实现:
头文件
#ifndef __STATE_H__
#define __STATE_H__
#include "Context.h"
#include <iostream>
class Context;
class BaseState {
public:
virtual void Handle(Context* context) = 0;
};
class ConcreteStateA : public BaseState {
public:
void Handle(Context* context);
};
class ConcreteStateB : public BaseState {
public:
void Handle(Context* context);
};
#endif
源文件
#include "State.h"
void ConcreteStateA::Handle(Context* context) {
std::cout << "当前状态是:A" << std::endl;
context->setState(new ConcreteStateB());
}
void ConcreteStateB::Handle(Context* context) {
std::cout << "当前状态是:B" << std::endl;
context->setState(new ConcreteStateA());
}
头文件
#ifndef __CONTEXT_H__
#define __CONTEXT_H__
#include "State.h"
#include <iostream>
class BaseState;
class Context {
public:
Context(BaseState* state);
~Context();
void setState(BaseState* state);
BaseState* getState();
void request();
public:
BaseState* m_state;
};
#endif
源文件
#include "Context.h"
Context::Context(BaseState* state) {
this->m_state = state;
}
Context::~Context() {
}
void Context::setState(BaseState* state) {
this->m_state = state;
}
BaseState* Context::getState() {
return this->m_state;
}
void Context::request() {
m_state->Handle(this);
}
应用代码
#include "State.h"
#include "Context.h"
#include <iostream>
int main() {
Context* context = new Context(new ConcreteStateA());
context->request();
context->request();
context->request();
context->request();
std::cout << "Hello World" << std::endl;
return 0;
}
结果如下所示:
当前状态是:A
当前状态是:B
当前状态是:A
当前状态是:B