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

示例控制器,直接对单个 QWidget 做 setDisabled(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. 设计收益

  • 将"流程控制"和"业务实现"解耦
  • 减少重复代码,统一执行入口
  • 子类扩展更安全,不易破坏流程顺序
  • 更利于测试和维护
  • 便于形成团队级流程规范与可复用组件
相关推荐
BroNekoX4 小时前
我将基于 QtQuick 框架开发的音乐播放器性能做到顶级
qt
Tt有了t7 小时前
设计模式速查
java·python·设计模式
一条Go7 小时前
四个进程,一把锁:Alioth 的告警评测为什么不需要消息队列
后端·设计模式·架构
小小晓.8 小时前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
一缕82年的清风10 小时前
被中产唾弃的“十元快剪”,藏着最狠的极客工程学
人工智能·设计模式
是2的10次方啊10 小时前
设计模式与生活⑫:周报又到手,别从空白开始
设计模式
拆房老料1 天前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
扶尔魔ocy1 天前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
lhbweilai1 天前
QT项目(串口助手)
开发语言·qt
工一木子1 天前
设计模式与生活⑩:地铁没变,你换了个状态
设计模式