今天是状态模式。

状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

下面是状态模式的UML图:

状态模式

下面是C++实现的代码:


/*
* initm.com
* 作者:Stupid
* 时间:2017-10-31 22:23
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为状态模式的基本结构代码。
*/
#include <QCoreApplication>
#include <iostream>

class Context;

class State
{
public:
    virtual void PrintType() = 0;
    virtual void Handle(Context* context) = 0;
    virtual ~State(){}
};

class Context
{
private:
    State* state;
public:
    Context(State* const& state): state(state){
        state->PrintType();
    }
    void SetState(State* const& state){
        this->state = state;
        state->PrintType();
    }
    State* GetState(){
        return state;
    }
    void Request(){
        state->Handle(this);
    }
};

class ConcreteStateA: public State
{
public:
    void Handle(Context* context)override final;
    void PrintType()override final{
        std::cout << "ConcreteStateA" << std::endl;
    }
};

class ConcreteStateB: public State
{
public:
    void Handle(Context* context)override final{
        if(nullptr != context->GetState()){
            delete context->GetState();
        }
        context->SetState(new ConcreteStateA);
    }
    void PrintType()override final{
        std::cout << "ConcreteStateB" << std::endl;
    }
};

class ConcreteStateC: public State
{
public:
    void Handle(Context* context)override final{
        if(nullptr != context->GetState()){
            delete context->GetState();
        }
        context->SetState(new ConcreteStateB);
    }
    void PrintType()override final{
        std::cout << "ConcreteStateC" << std::endl;
    }
};

void ConcreteStateA::Handle(Context* context){
    if(nullptr != context->GetState()){
        delete context->GetState();
    }
    context->SetState(new ConcreteStateC);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Context* context = new Context(new ConcreteStateA);

    context->Request();
    context->Request();
    context->Request();
    context->Request();

    return a.exec();
}


状态模式是通过Context类来决定何时更换状态的,更换状态后,Context的表现也就变了。