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