2025/10/22日 每日总结 设计模式实践:模板方法模式统一数据库操作流程

设计模式实践:模板方法模式统一数据库操作流程

在软件开发中,很多业务场景都存在“流程固定但部分步骤实现不同”的情况——比如不同数据库的操作,都遵循“连接→打开→使用→关闭”的固定流程,但连接数据库的方式因数据库类型而异。模板方法模式通过定义“算法骨架”,将可变步骤延迟到子类实现,完美解决这类问题。本文以数据库操作为例,用模板方法模式统一SQL Server和Oracle的操作流程,带你掌握其核心思想。

一、模板方法模式核心思想

模板方法模式是一种行为型设计模式,核心目标是统一算法流程,灵活替换可变步骤,其关键结构包括:

  1. 抽象类(Abstract Class):定义固定的算法骨架(模板方法),同时声明可变步骤的抽象方法(由子类实现),可包含通用的具体方法;

  2. 具体子类(Concrete Class):继承抽象类,实现抽象方法(可变步骤),不修改模板方法定义的流程;

  3. 模板方法(Template Method):抽象类中定义的固定流程方法,按顺序调用通用方法和抽象方法。
    该模式的核心优势:

  • 代码复用:固定流程和通用步骤在抽象类中实现,子类无需重复编写;

  • 流程统一:模板方法控制整体流程,避免子类随意修改流程顺序;

  • 扩展灵活:新增功能只需新增子类,实现抽象方法即可,符合“开闭原则”。

    二、实验场景:数据库操作的统一与差异

    数据库操作的共性与差异:

  • 共性流程:连接数据库(connDB)→ 打开数据库(openDB)→ 使用数据库(useDB)→ 关闭数据库(closeDB);

  • 差异点:仅“连接数据库”的实现不同(SQL Server和Oracle的连接协议、驱动不同)。
    用模板方法模式设计:

  • 抽象类(DBOperator):定义模板方法processOn(固定流程),实现openDB、useDB、closeDB(通用步骤),声明connDB为抽象方法(可变步骤);

  • 具体子类(SQLServerDBOperator、OracleDBOperator):分别实现connDB方法,适配各自的数据库连接逻辑。

    三、类图设计

    | DBOperator | // 抽象类
    +-------------------+
    
    
    
  • connDB(): void // 抽象方法:连接数据库(可变步骤)

  • openDB(): void // 具体方法:打开数据库(通用步骤)

  • useDB(): void // 具体方法:使用数据库(通用步骤)

  • closeDB(): void // 具体方法:关闭数据库(通用步骤)

  • processOn(): void // 模板方法:定义固定流程
    +-------------------+
    ^
    |
    +-------+-------+ +-------+-------+
    | | | |
    | SQLServerDBOperator | OracleDBOperator // 具体子类
    +---------------+ +---------------+

  • connDB(): void + connDB(): void
    +---------------+ +---------------+

    ## 四、完整代码实现
    ### 1. 抽象类(DBOperator):定义模板方法与通用步骤
    封装数据库操作的固定流程和通用逻辑,声明可变步骤为抽象方法。
    ```java
    /**
    * 抽象类:数据库操作模板
    * 定义数据库操作的固定流程(模板方法)和通用步骤
    */
    public abstract class DBOperator {
    // 抽象方法:连接数据库(可变步骤,由子类实现)
    public abstract void connDB();
    // 具体方法:打开数据库(通用步骤,所有数据库共用)
    public void openDB() {
    System.out.println("打开数据库");
    }
    // 具体方法:使用数据库(通用步骤,所有数据库共用)
    public void useDB() {
    System.out.println("使用数据库(执行查询/更新操作)");
    }
    // 具体方法:关闭数据库(通用步骤,所有数据库共用)
    public void closeDB() {
    System.out.println("关闭数据库,释放资源");
    }
    // 模板方法:定义数据库操作的固定流程(算法骨架)
    public void processOn() {
    this.connDB(); // 步骤1:连接数据库(子类实现)
    this.openDB(); // 步骤2:打开数据库(通用实现)
    this.useDB(); // 步骤3:使用数据库(通用实现)
    this.closeDB(); // 步骤4:关闭数据库(通用实现)
    }
    }
    

    2. 具体子类:实现可变步骤(数据库连接)

    分别适配SQL Server和Oracle的连接逻辑,无需关注整体流程。

    SQL Server数据库操作(SQLServerDBOperator)

    /**
    * 具体子类:SQL Server数据库操作
    * 实现SQL Server的连接逻辑
    */
    public class SQLServerDBOperator extends DBOperator {
    @Override
    public void connDB() {
    // SQL Server专属连接逻辑(如加载SQL Server驱动、指定连接URL)
    System.out.println("SQL Server:通过JDBC加载com.microsoft.sqlserver.jdbc.SQLServerDriver,连接数据库");
    }
    }
    

    Oracle数据库操作(OracleDBOperator)

    /**
    * 具体子类:Oracle数据库操作
    * 实现Oracle的连接逻辑
    */
    public class OracleDBOperator extends DBOperator {
    @Override
    public void connDB() {
    // Oracle专属连接逻辑(如加载Oracle驱动、指定连接URL)
    System.out.println("Oracle:通过JDBC加载oracle.jdbc.driver.OracleDriver,连接数据库");
    }
    }
    

    3. 客户端测试:验证模板方法的统一流程

    通过不同子类实例,验证模板方法是否能统一流程,同时适配不同数据库的连接逻辑。

    /**
    * 客户端测试类:验证模板方法模式的数据库操作
    */
    public class Client {
    public static void main(String[] args) {
    DBOperator dbOperator;
    // 测试SQL Server数据库操作
    System.out.println("=== 执行SQL Server数据库操作 ===");
    dbOperator = new SQLServerDBOperator();
    dbOperator.processOn();
    System.out.println("\n-----------------------\n");
    // 测试Oracle数据库操作
    System.out.println("=== 执行Oracle数据库操作 ===");
    dbOperator = new OracleDBOperator();
    dbOperator.processOn();
    }
    }
    

    五、运行结果与验证

    === 执行SQL Server数据库操作 ===
    SQL Server:通过JDBC加载com.microsoft.sqlserver.jdbc.SQLServerDriver,连接数据库
    打开数据库
    使用数据库(执行查询/更新操作)
    关闭数据库,释放资源
    

=== 执行Oracle数据库操作 ===
Oracle:通过JDBC加载oracle.jdbc.driver.OracleDriver,连接数据库
打开数据库
使用数据库(执行查询/更新操作)
关闭数据库,释放资源

### 结果分析:

1. 流程统一:两种数据库的操作流程完全一致(连接→打开→使用→关闭),由模板方法`processOn`控制;
2. 实现差异:仅连接数据库的逻辑不同,子类各自实现,不影响整体流程;
3. 代码复用:openDB、useDB、closeDB方法在抽象类中统一实现,子类无需重复编写。

  ## 六、模板方法模式的核心优势与适用场景

   ### 核心优势
4. 代码复用率高:通用逻辑集中在抽象类,避免子类重复编码;
5. 流程控制严格:模板方法固定流程顺序,子类无法修改,确保所有实现都遵循统一规范;
6. 扩展性强:新增数据库(如MySQL)时,只需新增子类实现`connDB`方法,无需修改现有代码;
7. 维护成本低:通用逻辑的修改只需在抽象类中操作一次,所有子类自动复用。

   ### 适用场景
8. 流程固定但部分步骤可变:如文档生成(固定“标题→正文→结尾”流程,正文内容可变)、测试用例执行(固定“初始化→执行→清理”流程);
9. 多个子类存在大量重复代码:提取重复逻辑到抽象类,子类仅实现差异部分;
10. 需要统一子类行为规范:确保所有子类都遵循相同的流程,避免流程混乱。

    ## 七、实践总结
11. 模板方法模式的核心是“父类定流程,子类填细节”,通过抽象方法延迟可变步骤的实现;
12. 模板方法必须是稳定的——如果流程本身需要频繁修改,不适合使用该模式;
13. 抽象类中的具体方法是通用逻辑,抽象方法是可变逻辑,划分清晰才能发挥模式优势;
14. 实际开发中,模板方法模式的典型应用包括:框架中的生命周期方法(如Spring Bean的初始化流程)、工具类的固定流程(如文件读写的“打开→操作→关闭”)。
    通过本次数据库操作的实践,我深刻体会到模板方法模式在统一流程、复用代码中的价值。它让代码结构更清晰,扩展更灵活,尤其适合处理“流程固定、细节各异”的业务场景。
posted @ 2025-12-29 14:42  Moonbeamsc  阅读(2)  评论(0)    收藏  举报
返回顶端