状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象。
状态模式一般包含Context(环境类)、State(抽象状态类)和ConcreteState(具体状态类)。
状态模式实例之论坛用户等级
从类图可知,ForumnAccount(论坛账户类)互相关联AbstractState(抽象状态类), 账户类的downloadFile、writeNote和replyNote等操作都由状态类的相关函数来操作,方便进行状态之前的转换。
下面是c++实现的版本。
由于c++对互相关联的类和调用并不友好,需要一定的声明和定义技巧,所以下面的代码顺序有点乱。
(也可以将代码分为h头文件和cpp文件,这样就不会出现这些问题,因为我是为了方便写在同一个cpp中)
环境类ForumAccount(论坛账号类)
//环境类ForumAccount(论坛账号类)
class AbstractState;
class ForumAccount{
public:
ForumAccount(string name);
void setState(AbstractState *state){
this->state = state;
}
AbstractState* getState(){
return this->state;
}
string getName(){
return this->name;
}
//定义在后面
void downloadFile(int score);
void writeNote(int score);
void replyNote(int score);
private:
AbstractState *state;
string name;
};
抽象类AbstractState(账号状态类)
//抽象类AbstractState(账号状态类)
class AbstractState{
public:
virtual void checkState(int score) = 0;
virtual void downloadFile(