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

  • 将"流程控制"和"业务实现"解耦
  • 减少重复代码,统一执行入口
  • 子类扩展更安全,不易破坏流程顺序
  • 更利于测试和维护
  • 便于形成团队级流程规范与可复用组件
相关推荐
A-Jie-Y11 分钟前
JAVA设计模式-抽象工厂模式
java·设计模式
故事还在继续吗44 分钟前
设计模式完全指南
设计模式
小短腿的代码世界1 小时前
QCefView深度解析:Qt应用中嵌入Chromium浏览器的终极方案
开发语言·qt
薛定谔的悦2 小时前
共享数据总线(DPR)设计模式——嵌入式系统的“内存数据库”
jvm·数据库·设计模式
A-Jie-Y3 小时前
JAVA设计模式-建造者模式
java·设计模式
无敌秋4 小时前
# C++ 工厂方法模式实战指南
开发语言·c++·设计模式
a里啊里啊5 小时前
软考-软件评测师:知识点整理(七)——软件工程
设计模式·软件工程·软考·uml·结构化开发·软件评测师·软件模型
小短腿的代码世界5 小时前
VLC-Qt深度解析:Qt应用中的专业视频播放方案
开发语言·qt
rrr25 小时前
【前端开发】|GUI 基本概念和框架基础
前端·qt
Z文的博客5 小时前
【避坑实录】Qt 4.8.6 + Paho MQTT C客户端 + OpenSSL静态链接的血泪史
c语言·开发语言·qt·嵌入式linux