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;
    }
  • 相关阅读:
    SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
    SonarQube系列二、分析dotnet core/C#代码
    SonarQube系列一、Linux安装与部署
    asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
    asp.net core 集成JWT(一)
    visual studio 各版本激活码
    服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
    一人撸PaaS之“应用”
    使用Roslyn脚本化C#代码,C#动态脚本实现方案
    try.dot.net 的正确使用姿势
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7783703.html
Copyright © 2011-2022 走看看