状态模式

状态模式

状态模式简介意图适用性举例UML设计代码示例思考

简介

状态模式类似于通过将行为进行类抽象,当用户改变状态变量时,实现不同行为对象的调用。

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

适用性

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

举例

一个工人一天的时间分为上班、睡觉、干其他事情三个时间段。我们可以用状态模式来标示一天中在干什么事情。

UML设计

代码示例

class State;
​
class Worker{
public:
    Worker();
    void setTime(int time);
    int getTime();
    void requestDoing();
protected:
    friend class State;
    void ChangeState(State* state);
private:
    State*  m_state;
    int         m_time;
}
​
class State{
public:
    static State* StateInstance() = 0;
    void doing(Worker*);
}
​
class WorkState:public State{
    static State* StateInstance(){……}
​
    void doing(Worker*);
}
​
class SleepState:public State{
    static State* StateInstance();
    void doing(Worker*);
}
​
class OtherState:public State{
    static State* StateInstance();
    void doing(Worker*);
}
​
Worker::Worker(){
    m_state = new WorkerState();
}
void Worker::setTime(int time){
    m_time = time;  
}
​
void Worker::requestDoing(){
    m_state.doing(this);
}
​
void WorkState::doing(Worker* worker){
    if(worker->getTime > 8 && worker->getTime() < 16){
        cout<<"working.";
    }else{
        worker->ChangeState(OtherState::StateInstance());
    }
}
void SleepState::doing(Worker* worker){
    ……
}
void OtherState::doing(Worker* worker){
    ……
}

思考

  • 状态模式是为了摆脱多条件判断而产生的一种设计方法,而通过上面的代码仅仅是将条件判断的场合进行了转移,并没有提供代码的简洁性。

  • 通过单例方法虽然能过解决对状态的newdelete的重复使用,但无法解决面对多工作者时状态行为的不一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值