Qt C++ State模式

本文通过一个具体实例介绍了状态模式(State Pattern)的基本概念及其在C++中的实现方式。该模式允许对象在其内部状态改变时改变它的行为,使得看似复杂的行为能够对应于一系列的状态对象。

我们在做多个条件判断的时候常会用到switch,如果条件和内容过于繁琐,内容庞大的话,state模式就十分有用了。

state.h

#pragma once


#include <QDebug>


class CState;
class CContext
{
public:
CContext(CState* state):m_state(state){}
~CContext();
void request();
void changeState(CState* state);


private:
CState* m_state;
};


class CState
{
public:
virtual void Handle(CContext *context) = 0;
};


class CConcreateStateA : public CState
{
public:
CConcreateStateA(){qDebug() << "this stateA!";}


public:
void Handle(CContext *context);
};


class CConcreateStateB : public CState
{
public:
CConcreateStateB(){qDebug() << "this stateB!";}


public:
void Handle(CContext *context);
};


state.cpp

#include "state.h"


CContext::~CContext()
{
delete m_state;
}


void CContext::request()
{
if (m_state)
{
m_state->Handle(this);
}
}


void CContext::changeState(CState* state)
{
if (m_state)
{
delete m_state;
m_state = 0;
}
m_state = state;
}


void CConcreateStateA::Handle(CContext *context)
{
if (context)
{
context->changeState(new CConcreateStateB);
}
}


void CConcreateStateB::Handle(CContext *context)
{
if (context)
{
context->changeState(new CConcreateStateA);
}
}


main.cpp

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


int main(int argc,char **argv)
{
QApplication app(argc,argv);
CConcreateStateA *stateA = new CConcreateStateA;
CContext *context = new CContext(stateA);
context->request();
context->request();
context->request();
delete context;

return app.exec();
}


### Qt C++ 设计模式实现与使用示例 #### 单例模式 (Singleton Pattern) 单例模式确保一个类只有一个实例,并提供全局访问点。在Qt中,可以通过静态成员函数来实现这一点。 ```cpp class Singleton : public QObject { Q_OBJECT private: static Singleton* instance; explicit Singleton(QObject *parent = nullptr); public: static Singleton* getInstance(); }; // Implementation file (.cpp) #include "singleton.h" Singleton* Singleton::instance = nullptr; Singleton* Singleton::getInstance() { if (!instance) { instance = new Singleton(); } return instance; } ``` 此方法遵循了Qt编码风格指南[^1],并提供了线程安全的初始化机制。 #### 工厂模式 (Factory Pattern) 工厂模式用于创建对象而无需指定具体的类。通过定义接口和具体实现分离,可以灵活地扩展应用程序的功能。 ```cpp class WidgetFactory { public: virtual QWidget* createWidget(QWidget* parent = nullptr) const = 0; }; class ButtonFactory : public WidgetFactory { public: QWidget* createWidget(QWidget* parent = nullptr) const override { return new QPushButton(parent); } }; ``` 这种设计允许轻松切换不同类型的控件样式[^2],同时也保持良好的可维护性和灵活性。 #### 观察者模式 (Observer Pattern) 观察者模式建立了一种一对多的关系依赖关系,在主题状态改变时自动通知所有订阅者更新自己。这非常适合处理信号槽通信场景下的跨线程交互需求。 ```cpp class Subject : public QObject { Q_OBJECT signals: void stateChanged(int newState); }; class Observer : public QObject { protected slots: void updateState(int newState) { qDebug() << "Received new state:" << newState; } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); auto subject = new Subject(&app); auto observer = new Observer(&app); connect(subject, &Subject::stateChanged, observer, &Observer::updateState); // Connect signal to slot emit subject->stateChanged(42); // Emit signal with value 42 return app.exec(); } ``` 上述代码展示了如何利用Qt内置的支持异步消息传递特性来进行高效的消息分发[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值