目录
[1. 观察者模式](#1. 观察者模式)
[2. 工厂模式](#2. 工厂模式)
[3. 单例模式](#3. 单例模式)
[4. 命令模式](#4. 命令模式)
[5. 适配器模式](#5. 适配器模式)
[6. 组合模式](#6. 组合模式)
[7. 策略模式](#7. 策略模式)
[8. 装饰器模式](#8. 装饰器模式)
[9. 职责链模式](#9. 职责链模式)
Qt 框架本身广泛采用了多种设计模式,开发者也可以基于这些模式构建更灵活、可维护的应用程序。以下是常见设计模式在 Qt 中的具体应用场景及示例:
1. 观察者模式
-
模式作用:对象间定义一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象自动得到通知。
-
Qt 应用 :
信号与槽机制(Signals and Slots) 是观察者模式的经典实现。-
信号(Signal):被观察者(Subject)触发事件。
-
槽(Slot):观察者(Observer)的事件处理函数。
示例:按钮点击事件处理
cppQPushButton *button = new QPushButton("Click me"); QObject::connect(button, &QPushButton::clicked, []() { qDebug() << "Button clicked!"; });
-
2. 工厂模式
-
模式作用:通过工厂类创建对象,隐藏具体类的实例化逻辑。
-
Qt 应用:
-
QWidget 组件创建 :通过基类指针创建具体子类对象(如
QPushButton
、QLabel
)。 -
QML 组件动态加载 :通过
Loader
组件按需创建界面元素。
示例:工厂方法创建按钮
cppQWidget* createWidget(const QString &type) { if (type == "button") return new QPushButton; else if (type == "label") return new QLabel; return nullptr; }
-
3. 单例模式
-
模式作用:确保一个类只有一个实例,并提供全局访问点。
-
Qt 应用:
-
QApplication:管理全局应用程序状态,保证单实例。
-
QSettings:统一管理应用程序配置。
示例:自定义单例类
cppclass Logger : public QObject { public: static Logger& instance() { static Logger logger; return logger; } void log(const QString &message) { qDebug() << message; } private: Logger() {} // 私有构造函数 }; // 使用 Logger::instance().log("Hello Qt");
-
4. 命令模式
-
模式作用:将请求封装为对象,支持撤销、重做和日志功能。
-
Qt 应用 :
QUndoFramework :提供QUndoCommand
基类,封装操作和撤销逻辑。示例:实现撤销/重做功能
cppclass AddCommand : public QUndoCommand { public: AddCommand(QList<int> &list, int value) : m_list(list), m_value(value) {} void redo() override { m_list.append(m_value); } void undo() override { m_list.removeLast(); } private: QList<int> &m_list; int m_value; }; // 使用 QUndoStack undoStack; QList<int> data; undoStack.push(new AddCommand(data, 42)); // 执行添加 undoStack.undo(); // 撤销
5. 适配器模式
-
模式作用:将一个类的接口转换为客户端期望的另一个接口。
-
Qt 应用 :
Model/View 框架 :通过QAbstractItemModel
适配不同数据源(如数据库、文件系统)到统一接口。示例:自定义适配器模型
cppclass CustomModel : public QAbstractTableModel { public: int rowCount(const QModelIndex &) const override { return m_data.size(); } int columnCount(const QModelIndex &) const override { return 2; } QVariant data(const QModelIndex &index, int role) const override { if (role == Qt::DisplayRole) return m_data[index.row()][index.column()]; return QVariant(); } private: QVector<QVector<QString>> m_data; };
6. 组合模式
-
模式作用:将对象组合成树形结构以表示"部分-整体"层次结构。
-
Qt 应用 :
QObject 父子对象树 :通过QObject::setParent()
管理对象的生命周期和事件传递。示例:构建对象树
cppQWidget *window = new QWidget; QVBoxLayout *layout = new QVBoxLayout(window); layout->addWidget(new QLabel("Title")); layout->addWidget(new QPushButton("OK")); window->show();
7. 策略模式
-
模式作用:定义算法族,封装每个算法并使它们可互换。
-
Qt 应用 :
布局管理器(QLayout) :动态切换布局策略(如QVBoxLayout
和QHBoxLayout
)。示例:动态切换布局
cppQWidget *widget = new QWidget; QLayout *layout = new QVBoxLayout(widget); // 切换为水平布局 delete layout; layout = new QHBoxLayout(widget);
8. 装饰器模式
-
模式作用:动态地为对象添加额外职责。
-
Qt 应用 :
QSS(Qt Style Sheets):通过样式表动态修改控件外观(如添加边框、背景)。示例:装饰按钮样式
cppQPushButton *button = new QPushButton("Styled Button"); button->setStyleSheet("background: blue; color: white; border-radius: 5px;");
9. 职责链模式
-
模式作用:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
-
Qt 应用 :
事件处理机制:事件在对象树中传递,直到被处理(如鼠标点击事件)。示例:自定义事件处理
cppclass CustomWidget : public QWidget { protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { qDebug() << "Left button pressed"; event->accept(); // 阻止事件继续传递 } else { QWidget::mousePressEvent(event); // 传递到父类处理 } } };
总结
设计模式 | Qt 应用场景 | 关键类/机制 |
---|---|---|
观察者模式 | 信号与槽、事件处理 | QObject::connect |
工厂模式 | 动态创建控件或 QML 组件 | QWidgetFactory 、Loader |
单例模式 | 全局状态管理(如配置、日志) | QApplication 、QSettings |
命令模式 | 撤销/重做框架 | QUndoCommand 、QUndoStack |
适配器模式 | Model/View 数据适配 | QAbstractItemModel |
组合模式 | 对象树管理 | QObject 父子关系 |
策略模式 | 布局管理器、算法替换 | QLayout 子类 |
装饰器模式 | 动态样式修改 | QSS(Qt Style Sheets) |
职责链模式 | 事件传递机制 | QEvent 、事件过滤器 |
通过结合 Qt 的框架特性(如信号槽、Model/View、QObject 树等),开发者可以更高效地应用设计模式,提升代码的可维护性和扩展性。