状态模式
序言
设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法
状态模式看起来好像和策略模式差不多,主要是其的侧重点不一样:
- 状态模式:适用于当对象的行为取决于它的状态时,以及需要在运行时根据状态改变对象的行为时。
- 策略模式 :适用于当有多种算法需要实现,并且这些算法可以相互替换时,或者当算法的实现需要频繁变化时。
.
理解
Employee持有State的父类接口,通过切换不同继承的State实体,运行统一实现的接口,即可根据当前Employee持有的State,运行因State不同的不同方法。
.
源码
State.h
cpp
class State
{
public:
/**
* @brief 产出率计算
* @return
*/
virtual int yieldsCalculation() const = 0;
};
class HungerState : public State
{
public:
virtual int yieldsCalculation() const;
};
class HappyState : public State
{
public:
virtual int yieldsCalculation() const;
};
class GrievanceState : public State
{
public:
virtual int yieldsCalculation() const;
};
State.cpp
cpp
int HungerState::yieldsCalculation() const
{
return 40;
}
int HappyState::yieldsCalculation() const
{
return 120;
}
int GrievanceState::yieldsCalculation() const
{
return 20;
}
.
Employee.h
cpp
class Employee
{
public:
Employee();
void switchHungerState();
void switchHappyState();
void switchGrievanceState();
int yieldsCalculation() const;
private:
std::unique_ptr< State > m_state;
};
Employee.cpp
cpp
Employee::Employee()
{
}
void Employee::switchHungerState()
{
m_state.reset(new HungerState);
}
void Employee::switchHappyState()
{
m_state.reset(new HappyState);
}
void Employee::switchGrievanceState()
{
m_state.reset(new GrievanceState);
}
int Employee::yieldsCalculation() const
{
if (m_state)
return m_state->yieldsCalculation();
else
return 0;
}
.
使用地方:
cpp
Employee ctx;
ctx.switchHungerState()
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;
ctx.switchHappyState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;
ctx.switchGrievanceState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;