zoukankan      html  css  js  c++  java
  • 行为型模型 状态模式

    行为型模型 状态模式

    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;
    }
  • 相关阅读:
    xadmin 调用登录报错信息 :takes 0 positional argument but 2 were given解决方法
    xadmin 执行报错 Your STATICFILES_DIRS setting is not a tuple or list
    WordPress的SEO技术
    微信公众平台消息接口星标功能
    微信5.0打飞机怎么取得高分?
    微信公众平台的服务号和订阅号
    微信公众平台开发(58)自定义菜单
    微信公众平台开发(57)Emoji表情符号
    微信公众平台开发(56)优惠券
    微信公众平台开发(55)刮刮乐
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7783703.html
Copyright © 2011-2022 走看看