• 状态模式


     允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

    在state模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大量的 case 分支语句,并且这些分支依赖于对象的状态。state模式将每一个分支都封装到独立的类中。

    代码:

    #include <iostream>
    using namespace std;
    
    #define CC_SAFE_DELETE(p) if ((p)) {delete (p); (p) = NULL;}
    
    class Work;
    
    class State
    {
    public:
        virtual ~State() {}
    public:
        virtual void writeProgram(Work *w) = 0;
    };
    
    // 上午工作状态
    class ForenoonState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    // 中午工作状态
    class NoonState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    // 下午工作状态
    class AfternoonState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    // 晚间工作状态
    class EveningState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    // 睡眠状态
    class SleepingState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    // 下班休息状态
    class RestState : public State
    {
    public:
        virtual void writeProgram(Work *w);
    };
    
    class Work
    {
    public:
        Work()
        {
            _curState = new ForenoonState();
            _taskFinished = false;
        }
    
        ~Work()
        {
            CC_SAFE_DELETE(_curState);
        }
        inline void setHour(int h){ _hour = h; }
        inline int getHour(){ return _hour; }
        inline bool getTaskFinished(){ return _taskFinished; }
        void setTaskFinished(bool finished = true){ _taskFinished = finished; }
    
        void changeState(State *s)
        {
            if (_curState != s)
            {
                CC_SAFE_DELETE(_curState);
                _curState = s;
            }
        }
    
        void writeProgram()
        {
            _curState->writeProgram(this);
        }
    
        
    private:
        int _hour;    //时间
        State *_curState;  //工作状态
        bool _taskFinished;
    };
    
    
    void ForenoonState::writeProgram(Work *w)
    {
        if (w->getHour() < 12)
        {
            cout << "当前时间: " << w->getHour() << "点 上午工作,精神百倍" << endl;
        }
        else
        {
            w->changeState(new NoonState());
            w->writeProgram();
        }
    }
    
    void NoonState::writeProgram(Work *w)
    {
        if (w->getHour() < 13)
        {
            cout << "当前时间: " << w->getHour() << "点 午休时间" << endl;
        }
        else
        {
            w->changeState(new AfternoonState());
            w->writeProgram();
        }
    }
    
    void AfternoonState::writeProgram(Work *w)
    {
        if (w->getHour() < 18)
        {
            cout << "当前时间: " << w->getHour() << "点 下午状态不错, 努力工作" << endl;
        }
        else
        {
            w->changeState(new EveningState());
            w->writeProgram();
        }
    }
    
    void EveningState::writeProgram(Work *w)
    {
        if (w->getTaskFinished())
        {
            w->changeState(new RestState()); // 下班
            w->writeProgram();
        }
        else
        {
            if (w->getHour() < 22)
            {
                cout << "当前时间: " << w->getHour() << "点 加班哦, 疲惫至极" << endl;
            }
            else
            {
                w->changeState(new SleepingState());
                w->writeProgram();
            }
        }
    }
    
    void RestState::writeProgram(Work *w)
    {
        cout << "当前时间是: " << w->getHour() << "点 下班回家了" << endl;
    }
    
    void SleepingState::writeProgram(Work *w)
    {
        cout << "当前时间是: " << w->getHour() << "点, 不行了,睡觉了" << endl;
    }
    
    void test()
    {
        Work *w = new Work();
        w->setHour(9);
        w->writeProgram();
        w->setHour(10);
        w->writeProgram();
        w->setHour(12);
        w->writeProgram();
        w->setHour(14);
        w->writeProgram();
        w->setHour(19);
        w->writeProgram();
        //w->setTaskFinished();
        w->setHour(20);
        w->writeProgram();
        w->setHour(23);
        w->writeProgram();
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }
    View Code

    效果:

  • 相关阅读:
    107、Java中String类之判断开头或结尾
    106、Java中String类之使用contains()方法判断子字符串是否存在
    105、Java中String类之利用indexOf()方法判断子字符串是否存在
    104、Java中String类之使用indexOf()等功能查找
    103、Java中String类之compareTo()方法
    102、Java中String类之相等判断(忽略大小写)
    101、Java中String类之判断是否由数字组成
    100、Java中String类之字符串转为大写
    099、Java中String类之字符数组与字符串的转换
    098、Java中String类之charAt()方法
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6817502.html
Copyright © 2020-2023  润新知