ڼС
梦回起点
做你害怕做的事,你会发现:不过如此
本站基于WordPress—主题by 设计窝
冀ICP备15003737号
梦回起点
Copyright © 2015-2024 All rights reserved.

状态模式模式——大话设计模式读书笔记

今天是状态模式。

状态模式(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的表现也就变了。

2017-10-31
                         
暂无评论

发表回复