设计模式——状态模式

使用QT新建Widget工程。

widget.h如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>

class Context;

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

class Context {
private: State* m_state;
public: Context();
    void SetState(State* state);
    State* GetState(void);
};

class StartState : public State {
    public : StartState();
    virtual void toString();
    virtual void doAction(Context* context);
    virtual ~StartState();
};

class StopState : public State {
    public : StopState();
    virtual void toString();
    virtual void doAction(Context* context);
    virtual ~StopState();
};

#endif // WIDGET_H

widget.cpp如下:

#include "widget.h"

State::~State() { }
StartState::StartState() { }
StartState::~StartState() { }
StopState::StopState() { }
StopState::~StopState() { }

void StartState::toString() {
    qDebug()<<"StartState toString";
}

void StartState::doAction(Context *context) {
    qDebug()<<"StartState doAction";
    context->SetState(this);
}

void StopState::toString() {
    qDebug()<<"StopState toString";
}

void StopState::doAction(Context *context) {
    qDebug()<<"StopState doAction";
    context->SetState(this);
}

Context::Context() {
    m_state = nullptr;
}

void Context::SetState(State* state) {
    m_state = state;
}

State* Context::GetState() {
    return m_state;
}

main.cpp如下:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    Context* context = new Context();

    StartState* start = new StartState();
    start->doAction(context);
    context->GetState()->toString();

    StopState* stop = new StopState();
    stop->doAction(context);
    context->GetState()->toString();

    return a.exec();
}

运行结果如下:

说明:状态模式适合用于状态机、流程控制,可以替代if else。但是一个状态就是一个类,状态太多时,不适用。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值