您的位置:首页 > 其它

设计模式一日一练:状态模式(State)

2014-05-18 11:34 344 查看
State模式,允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。State模式的一个典型应用是TCP连接,GoF的《设计模式》上有TCP实现的一个简化版本,值得好好研究。这里,我写一个简单的电灯开关例子。

// state - abstract
class State: public Singleton {
    public:
        virtual void PressSwitch(Light* light) = 0;
        virtual const char* GetName() = 0;
}

// state - on
class StateOff;
class StateOn: public State {
    public:
        virtual void PressSwitch(Light* light);
        virtual const char* GetName();
}

void StateOn::PressSwitch(Light* light) {
    light->ChangeState(StateOff::Instante());
}

const char* StateOn::GetName() {
    return "StateOn";
}

// state - off
class StateOff: public State {
    public:
        virtual void PressSwitch(Light* light);
        virtual const char* GetName();
}

const char* StateOff::GetName() {
    return "StateOff";
}

void StateOff::PressSwitch(Light* light) {
    light->ChangeState(StateOn::Instante());
}

// context - light
class Light {
    public:
        Light();
        State* GetState();
        void PressSwitch();
        
    private:
        friend class State;
        void ChangeState(State* state);
        
    private:
        State* state;
}

Light::Light() {
    this->state = StateOff::Instance();
}

State* Light::GetState() {
    return this->state;
}

void Light::PressSwitch() {
    printf("PressSwitch - from state %s", this->state->GetName());
    this->state->PressSwitch(this);
    printf("PressSwitch - to state %s", this->state->GetName());
}

void Light::ChangeState(State* state) {
    this->state = state;
}

// test
void Test() {
    Light* light = new Light();
    light->PressSwitch();
    light->PressSwitch()
    
    // todo ...   destroy
}


PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: