行为型模型 状态模式

 

行为型模型 状态模式_设计模式

 

Context:用户对象
        拥有一个State类型的成员,以标识对象的当前状态;
State:接口或基类
        封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类
        实现了一个与Context某个状态相关的行为。

适用于:
        对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。

 

/**
 * 行为型模型 状态模式
 * State模式也叫状态模式,是行为设计模式的一种。
 * State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
 * 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

// 前置声明
class Context;

class State
{
public:
    virtual void doAction(Context * context) = 0;
    virtual std::string toString() = 0;
    virtual ~State() {}
};

class Context
{
public:
    Context()
    {
        state = nullptr;
    }

    void setState(State * state)
    {
        this->state = state;
    }

    State * getState()
    {
        return state;
    }

    void doAction()
    {
        if ( state == nullptr )
        {
            std::cout << "None state" << std::endl;
        }
        else
        {
            state->doAction(this);
        }
    }

private:
    State * state;
};

class StartState: public State
{
public:
    virtual void doAction(Context * context) override
    {
        if (context->getState() == nullptr)
        {
            std::cout << "None start state" << std::endl;
        }
        else
        {
            std::cout << context->getState()->toString() << ": Player is in start state" << std::endl;
        }
    }
    virtual std::string toString() override
    {
        return "Start State";
    }
};

class StopState: public State
{
public:
    virtual void doAction(Context * context) override
    {
        if (context->getState() == nullptr)
        {
            std::cout << "None stop state" << std::endl;
        }
        else
        {
            std::cout << context->getState()->toString() << ": Player is in stop state" << std::endl;
        }
    }
    virtual std::string toString() override
    {
        return "Stop State";
    }
};

void mytest()
{
    Context * context = new Context();
    StartState * startState = new StartState();
    StopState * stopState = new StopState();
    context->doAction();
    context->setState(startState);
    context->doAction();
    context->setState(stopState);
    context->doAction();

    delete stopState;
    stopState = nullptr;
    delete startState;
    startState = nullptr;
    delete context;
    context = nullptr;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}