• 模板方法模式:封装不变步骤,引导扩展实现灵活多态的算法流程


    一、引言

    模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个操作中的算法骨架,并允许子类为其中的某些步骤提供具体实现。这种模式使得子类可以在不改变算法整体结构的情况下,重新定义算法中某些可变部分的实现。

    二、应用场景与技术背景

    模板方法模式适用于以下场景:

    1. 一个抽象类公开了执行其算法的模板方法,该方法由一系列基本操作步骤组成,其中一些步骤在抽象类中已实现,而另外一些步骤留给子类去实现。
    2. 复用相同算法的不同变体,只需要在每个变体中重写特定步骤即可。

    例如,在软件开发过程中,可能需要构建一个通用的数据处理流程,如数据读取、预处理、计算和结果输出等步骤。这些步骤中的数据读取和输出方式可能会因项目需求而变化,但处理流程的基本框架保持不变。此时,可以使用模板方法模式来设计这个数据处理框架。

    三、模式定义与实现

    模板方法模式的核心组成部分包括:

    在这里插入图片描述

    1. AbstractClass(抽象类角色):定义了一个或多个操作的模板方法,这些方法通常包含了一系列已定义好的步骤,同时也可以定义一些抽象方法供子类实现。
    2. ConcreteClass(具体类角色):是AbstractClass的子类,实现了在抽象类中声明的抽象方法,从而完成算法中可变部分的定制。

    四、实例详解

    以咖啡制作过程为例,来具体实现模板方法模式:

    1. 定义抽象类(AbstractClass):创建一个名为CoffeeMaker的抽象类,它定义了煮咖啡的基本步骤,其中“煮水”和“添加调料”等步骤是固定的,而“选择咖啡豆”和“研磨咖啡豆”则作为抽象方法留给子类实现。

      public abstract class CoffeeMaker {
          // 模板方法
          public final void makeCoffee() {
              boilWater();
              brewCoffeeGrinds();
              pourInCup();
              addCondiments();
          }
      
          // 固定步骤
          protected void boilWater() {
              System.out.println("开始烧开水...");
          }
          
          protected void pourInCup() {
              System.out.println("将咖啡倒入杯中...");
          }
      
          // 抽象方法,留给子类实现
          protected abstract void chooseCoffeeBeans();
      
          protected abstract void grindCoffeeBeans();
      
          // 其他固定步骤
          protected void brewCoffeeGrinds() {
              System.out.println("开始冲泡咖啡粉...");
          }
      
          protected void addCondiments() {
              System.out.println("加入调料...");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
    2. 定义具体类(ConcreteClass):创建两个具体的咖啡机类EspressoMachineFrenchPressMachine,它们继承自CoffeeMaker并实现抽象方法。

      public class EspressoMachine extends CoffeeMaker {
          @Override
          protected void chooseCoffeeBeans() {
              System.out.println("选用浓缩咖啡豆...");
          }
      
          @Override
          protected void grindCoffeeBeans() {
              System.out.println("精细研磨浓缩咖啡豆...");
          }
      }
      
      public class FrenchPressMachine extends CoffeeMaker {
          @Override
          protected void chooseCoffeeBeans() {
              System.out.println("选用法式压滤咖啡豆...");
          }
      
          @Override
          protected void grindCoffeeBeans() {
              System.out.println("粗略研磨法式压滤咖啡豆...");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    3. 应用端使用:根据需要选择不同的咖啡机制作咖啡。

      public class TemplateMethodPatternDemo {
          public static void main(String[] args) {
              CoffeeMaker espressoMaker = new EspressoMachine();
              espressoMaker.makeCoffee();
      
              System.out.println("===========================");
      
              CoffeeMaker frenchPressMaker = new FrenchPressMachine();
              frenchPressMaker.makeCoffee();
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    ``

    测试结果

    在这里插入图片描述

    五、优缺点分析

    优点:

    1. 提高代码复用性:通过将不变的操作步骤放在抽象类中,子类只需关注差异化的部分,提高了代码的复用性。
    2. 结构清晰:模板方法定义了算法的骨架,使得整个流程更加清晰,易于理解和维护。

    潜在挑战:

    1. 过度约束:如果模板方法过于严格,可能导致子类无法灵活地扩展或修改算法的某些部分。
    2. 增强了类之间的耦合:虽然模板方法模式能够提高内部结构的复用性,但也增强了抽象类和具体子类间的耦合。

    总结

    ​ 模板方法模式通过在抽象类中定义一个算法骨架,并将可变步骤交由子类实现,有效地实现了算法结构的复用以及灵活扩展。在实际应用中,合理运用模板方法模式能有效组织复杂流程,降低代码重复度,并促进代码结构的清晰化和模块化。然而,在设计时应注意避免过度限制子类的行为,以及控制好抽象类与子类之间的耦合程度。

  • 相关阅读:
    boom lab分析
    VTK 基础入门 ( 一 ) 相机设置
    手游模拟器长时间运行后,游戏掉帧且不恢复
    【已解决】Operation timed out 问题
    期货开户保证金能极端行情保安全
    [jmx]zookeeper/kafka/hive/hadoop/presto/presto等组件的jmx监控汇集
    java计算机毕业设计项目材料管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    腾讯云2023年双十一优惠活动整理汇总
    【运维心得】ftp命令行使用
    【2024全新版】程序员必会英语词汇表
  • 原文地址:https://blog.csdn.net/CAUC_lin/article/details/136303670