意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
结构图:来自 《23种设计模式 - 郗晓勇》
实现:https://github.com/panshiqu/patterns/tree/master/State
Context
namespace NS_STATE {
class State;
class Context {
public:
Context(State *state) : _state(state) {}
virtual ~Context() {}
void request(void);
private:
friend class State;
void changeState(State *state);
private:
State *_state;
};
} /* namespace NS_STATE */
#include "Context.h"
#include "State.h"
namespace NS_STATE {
void Context::request(void)
{
_state->handle(this);
}
void Context::changeState(State *state)
{
_state = state;
}
} /* namespace NS_STATE */
State
#include "Context.h"
namespace NS_STATE {
class State {
public:
State() {}
virtual ~State() {}
virtual void handle(Context *context) = 0;
protected:
void changeState(Context *context, State *state)
{
context->changeState(state);
}
};
} /* namespace NS_STATE */
ConcreteStateA
#include "State.h"
#include "ConcreteStateB.h"
#include <iostream>
namespace NS_STATE {
class ConcreteStateA : public State
{
public:
ConcreteStateA() {}
virtual ~ConcreteStateA() {}
virtual void handle(Context *context)
{
std::cout << "ConcreteStateA." << std::endl;
changeState(context, ConcreteStateB::getInstance());
}
};
} /* namespace NS_STATE */ConcreteStateB
#include "State.h"
#include <iostream>
namespace NS_STATE {
class ConcreteStateB : public State
{
public:
ConcreteStateB() {}
virtual ~ConcreteStateB() {}
static ConcreteStateB *getInstance(void)
{
static ConcreteStateB instance;
return &instance;
}
virtual void handle(Context *context)
{
std::cout << "ConcreteStateB." << std::endl;
}
};
} /* namespace NS_STATE */main
#include "State/Context.h"
#include "State/ConcreteStateA.h"
#include "State/ConcreteStateB.h"
using namespace NS_STATE;
int main(void)
{
ConcreteStateA csa;
Context c(&csa);
c.request();
c.request();
}附加:
本文介绍状态模式的概念及其实现方式,通过实例演示如何让对象在不同状态下表现出不同的行为,仿佛其内部类发生了变化。
&spm=1001.2101.3001.5002&articleId=46835165&d=1&t=3&u=e2664e2c6ba44e24a20df4e6834af5e9)
161

被折叠的 条评论
为什么被折叠?



