设计模式-模板方法实现

文章目录

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将某些步骤的实现延迟到子类中。通过这种方式,模板方法模式可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤

模式结构

模板方法模式的结构包括以下几个关键部分:

  1. 抽象类(Abstract Class):定义算法的骨架,并包含一个或多个抽象方法,留给子类实现
  2. 具体子类(Concrete Class):实现抽象类中的抽象方法,完成具体的算法步骤
  3. 模板方法(Template Method):在抽象类中定义的具体方法,按照一定的步骤调用抽象方法,确保算法的整体结构

模式特点

  • 封装不变部分,扩展可变部分:算法的骨架固定在抽象类中,具体实现细节由子类完成
  • 遵循开闭原则:新增功能时,只需扩展子类,而不需要修改抽象类
  • 减少代码重复:公共逻辑封装在抽象类中,避免子类重复实现

示例代码

以下是一个使用模板方法模式的示例:制作饮品的过程

java 复制代码
// 抽象类:饮品制作流程
abstract class Beverage {
    // 模板方法:定义饮品制作的算法骨架
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 公共步骤,所有饮品都需要
    private void boilWater() {
        System.out.println("Boiling water.");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup.");
    }

    // 抽象步骤,由子类实现
    protected abstract void brew();
    protected abstract void addCondiments();

    // 钩子方法:提供默认实现,子类可选择覆盖
    protected boolean customerWantsCondiments() {
        return true;
    }
}

// 具体类:制作茶
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the tea.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding lemon.");
    }
}

// 具体类:制作咖啡
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Dripping coffee through filter.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding sugar and milk.");
    }
}

// 测试代码
public class TemplateMethodExample {
    public static void main(String[] args) {
        System.out.println("Making tea:");
        Beverage tea = new Tea();
        tea.prepareRecipe();

        System.out.println("\nMaking coffee:");
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

输出结果

java 复制代码
Making tea:
Boiling water.
Steeping the tea.
Pouring into cup.
Adding lemon.

Making coffee:
Boiling water.
Dripping coffee through filter.
Pouring into cup.
Adding sugar and milk.

关键点解析

  1. 模板方法的作用 :
    • prepareRecipe() 是模板方法,定义了制作饮品的固定流程。
    • 子类通过实现 brew() 和 addCondiments() 方法,提供具体的制作细节。
  2. 钩子方法的灵活性 :
    • 钩子方法 customerWantsCondiments() 提供了默认实现,子类可以选择性地覆盖它来改变行为。
  3. 防止子类修改流程 :
    • 模板方法通常使用 final 修饰,防止子类改变算法骨架。

模式的优缺点

优点:

  1. 代码复用:将通用代码封装在抽象类中,减少重复代码。
  2. 灵活扩展:子类可以通过实现或重写方法定制具体行为。
  3. 清晰的流程控制:模板方法明确了算法的步骤和执行顺序。

缺点:

  1. 类的数量增加:每个具体实现都需要定义一个子类,可能导致类的数量增多。
  2. 继承的限制:模板方法模式依赖继承,可能降低灵活性,子类之间存在强耦合。

使用场景

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

  1. 具有固定流程的操作:算法的步骤固定,但某些步骤的实现可能变化。
  2. 复用公共逻辑:多个子类有相同的操作步骤,可以抽取到抽象类中。
  3. 需要灵活扩展的流程:通过钩子方法和抽象方法,子类可以灵活定制行为。

总结

模板方法模式通过将算法的骨架固定在抽象类中,确保了流程的稳定性,同时允许子类定制具体实现,达到了复用与扩展的平衡。它是一种经典的设计模式,广泛应用于框架设计、业务流程管理等场景中。

相关推荐
nice_lcj5205 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河666 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff7 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A7 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊8 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊8 小时前
LeetCode2001~2020题目解析
java·leetcode
用户3721574261358 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
SL_staff9 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
nice_lcj52010 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐10 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang