23种设计模式C++实例之状态模式

  • 状态模式:类的行为是基于它的状态改变的
  • 主要角色
    • 上下文
    • 抽象状态
    • 具体状态
#include <iostream>

using namespace std;

/*
 * 状态模式
 * */

class Worker;
class State;
class StateOne;
class StateTwo;

class Worker {
    public:
        Worker();
        ~Worker();
        void dothing();
        int getHour() {
            return hour;
        }
        void setHour(int hour) {
            this->hour = hour;
        }
        State* getCurState() {
            return state;
        }
        void setState(State* state) {
            this->state = state;
        }
    private:
        int hour;
        State* state;
};

class State {
    public:
        virtual ~State() {}
        virtual void dothing(Worker* worker) = 0;
};

class StateOne: public State {
    public:
        virtual void dothing(Worker* worker);
};

class StateTwo: public State {
    public:
        virtual void dothing(Worker* worker); 
};

void StateOne::dothing(Worker* worker) {
    int h = worker->getHour();
    if (h == 7 || h == 8) {
        cout << "eat" << endl; 
    } else {
        delete worker->getCurState();
        worker->setState(new StateTwo);
        worker->getCurState()->dothing(worker); 
    }
}

void StateTwo::dothing(Worker* worker) {
    int h = worker->getHour();
    if (h >= 9) {
        cout << "work" << endl; 
    } else {
        delete worker->getCurState();
        worker->setState(new StateTwo);
        worker->getCurState()->dothing(worker); 
    }
}

Worker::Worker() {
    state = new StateOne;
}

Worker::~Worker() {
    if (state != NULL){
        delete state;
        state = NULL;
    }
}

void Worker::dothing() {
    state->dothing(this);
}

int main() {
    Worker* w = new Worker;
    w->setHour(7);
    w->dothing();

    w->setHour(10);
    w->dothing();

    delete w;

    return 0;
}

GOF设计模式C++实例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值