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

  • 将"流程控制"和"业务实现"解耦
  • 减少重复代码,统一执行入口
  • 子类扩展更安全,不易破坏流程顺序
  • 更利于测试和维护
  • 便于形成团队级流程规范与可复用组件
相关推荐
Aaron_dw2 小时前
QT软件开发设计模式-观察者模式
qt·观察者模式·设计模式
Chasing__Dreams3 小时前
python--设计模式--13.1--结构性--享元模式
python·设计模式·享元模式
小温冲冲3 小时前
ReSharper 在 Visual Studio 中的详细配置指南
c++·ide·qt·visual studio
爱搞事的程小猿3 小时前
qt系统字体方案
c++·qt
彭于晏Yan3 小时前
Spring Boot中适配器模式的实现方式
spring boot·设计模式·适配器模式
C++ 老炮儿的技术栈3 小时前
C++、C#常用语法对比
c语言·开发语言·c++·qt·c#·visual studio
Ronin3053 小时前
【Qt常用控件】多元素控件
开发语言·qt·常用控件·多元素控件
※※冰馨※※4 小时前
【QT】System error #1455: 页面文件太小,无法完成操作
开发语言·windows·qt
奇树谦4 小时前
QMap 全面解析(Qt5 vs Qt6)
开发语言·qt