QT软件开发设计模式-模板方法模式

1. 模式概述

模板方法模式(Template Method)的核心思想是:

  • 在基类中定义算法骨架(固定执行顺序)
  • 将可变步骤延迟到子类实现
  • 通过钩子函数支持流程扩展

在 Qt 软件中,这种模式非常适合"流程固定、步骤可变"的业务,例如:

  • 页面刷新流程
  • 配置加载流程
  • 通知前后资源控制流程

2. 设计原则

本模块仅体现模板方法模式的通用原则,不依赖任何具体业务:

  1. 在基类中固化执行顺序
  2. 通过抽象步骤暴露可变点
  3. 通过钩子函数支持轻量扩展
  4. 将错误处理与状态回收纳入统一流程

3. 模块结构

  • modules/template_method_module/template_method_module.h
  • modules/template_method_module/template_method_module.cpp
  • modules/template_method_module/example_usage.cpp

4. 核心类说明

4.1 TemplateProcessModule

通用模板基类,定义固定算法骨架:

  • run():流程入口(固定顺序)
  • beforeProcess():前置步骤钩子
  • doProcessCore():核心步骤(纯虚函数)
  • afterProcess(bool success):后置步骤钩子
  • onProcessError(...):错误处理钩子

4.2 GuardedActionTemplateProcess

模板子类(资源守卫版本):

  • 执行前禁用/加锁资源
  • 执行核心动作(CoreAction
  • 执行后恢复/解锁资源

4.3 IExclusiveWidgetController

互斥控件控制接口,可适配任意资源控制器。

4.4 SingleWidgetController

示例控制器,直接对单个 QWidgetsetDisabled(true/false)

5. 使用步骤

  1. 引入头文件
  2. 继承 TemplateProcessModule 并实现 doProcessCore()
  3. 按需重写 beforeProcess() / afterProcess()
  4. 调用 run() 执行固定流程

示例:

复制代码
class DemoTemplateProcess : public template_method_module::TemplateProcessModule {
protected:
    bool beforeProcess() override { return true; }

    bool doProcessCore() override
    {
        // 核心业务
        return true;
    }

    void afterProcess(bool success) override
    {
        Q_UNUSED(success);
    }
};

6. 场景化用法(通用资源守卫)

复制代码
template_method_module::SingleWidgetController controller(targetWidget);
template_method_module::GuardedActionTemplateProcess process(&controller);

process.setCoreAction([]() {
    // 执行核心业务动作
});

const bool ok = process.run();

7. 延申与拓展

你可以基于此模块快速构建以下扩展能力:

  • 重试模板:在 doProcessCore() 中封装重试与退避策略
  • 指标模板:在 beforeProcess()/afterProcess() 中统计耗时、成功率
  • 事务模板:在前后钩子中执行 begin/commit/rollback
  • 策略组合:将核心动作改为可替换策略对象
  • 异步模板:将核心步骤放入线程池,后置钩子回收资源

示例(重试模板思路):

复制代码
class RetryableTemplateProcess : public template_method_module::TemplateProcessModule {
protected:
    bool doProcessCore() override
    {
        // 多次尝试核心动作
        return true;
    }
};

8. 工程接入

将模块文件加入 .pro

复制代码
SOURCES += \
    modules/template_method_module/template_method_module.cpp

HEADERS += \
    modules/template_method_module/template_method_module.h

9. 设计收益

  • 将"流程控制"和"业务实现"解耦
  • 减少重复代码,统一执行入口
  • 子类扩展更安全,不易破坏流程顺序
  • 更利于测试和维护
  • 便于形成团队级流程规范与可复用组件
相关推荐
大丑哥9 小时前
QT QML 中实现高亮功能
qt
小白不想画工图12 小时前
银河麒麟V10系统安装QT5.12
linux·开发语言·qt·银河麒麟
mengzhi啊13 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
@福者16 小时前
C++ QT 入门
开发语言·c++·qt
长友cy16 小时前
Qt官方示例BluetoothLowEnergyGame源码阅读
开发语言·qt
Quz16 小时前
QML 日期解析:字符串转日期与时间戳互转
qt
Coodor16 小时前
信创系统基于QT5操作NFC读写器
开发语言·qt·智能卡·nfc读写器·yw-607hc
励志不掉头发的内向程序员16 小时前
【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之Action与命令系统
linux·开发语言·c++·qt·学习·系统架构
码匠许师傅16 小时前
【设计模式精讲】15.享元模式(Flyweight)
c++·设计模式·享元模式·uml
事圆则缓17 小时前
Android 常用设计模式速查
android·设计模式