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. 设计收益

  • 将"流程控制"和"业务实现"解耦
  • 减少重复代码,统一执行入口
  • 子类扩展更安全,不易破坏流程顺序
  • 更利于测试和维护
  • 便于形成团队级流程规范与可复用组件
相关推荐
小短腿的代码世界1 天前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
我在人间贩卖青春1 天前
重学Qt——Qt常用界面组件
qt
nnsix1 天前
设计模式 - 模板方法模式 笔记
笔记·设计模式·模板方法模式
Larry_Yanan1 天前
QML面试常见问题(一)QML中组件呈现方式的方法有哪些
开发语言·c++·qt·ui·面试
likerhood1 天前
设计模式-装饰器模式(java)
java·设计模式·装饰器模式
程序leo源1 天前
Qt信号与槽深度详解
c语言·开发语言·数据库·c++·qt·c#
yu85939581 天前
基于 QT5.7.0 的八线激光雷达点云聚类实现
开发语言·qt·聚类
努力努力再努力wz1 天前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
郝学胜-神的一滴2 天前
Qt 高级开发 006: 架构全解 + 高效学习指南
开发语言·c++·qt·程序人生·架构
会开花的二叉树2 天前
Qt信号槽这套机制
开发语言·qt