java 设计模式 模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些有一定公共流程,但某些步骤需要子类定制化的场景。
想学习springboot,springboot+vue项目,SpringCloudAlibaba的小伙伴,可以免费观看视频地址:

springcloudalibaba地址:

html 复制代码
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112

springboot地址:

html 复制代码
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112

springboot+vue案例地址:

html 复制代码
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112

模板方法模式的主要角色:

  1. 抽象类(Abstract Class):定义算法的框架和扩展点(即模板方法和钩子方法)。
  2. 具体实现类(Concrete Classes):实现抽象类中的抽象方法。

简单案例:制作饮料

假设我们有一个饮料店,提供两种饮料:咖啡和绿茶。制作这两种饮料的基本步骤是相似的,但某些步骤(比如添加的调料)有所不同。我们可以使用模板方法模式来定义一个通用的制作饮料流程,并允许每种饮料自定义特定的步骤。

1. 定义抽象类(Abstract Class)
java 复制代码
public abstract class Beverage {
    // 模板方法
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 钩子方法,子类可以覆盖此方法以返回不同的值
    public abstract boolean customerWantsCondiments();

    // 基本方法,子类可以覆盖,但通常不覆盖
    public void boilWater() {
        System.out.println("Boiling water");
    }

    public void brew() {
        System.out.println("Brewing the tea");
    }

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

    // 抽象方法,子类必须实现
    public abstract void addCondiments();
}
2. 创建具体实现类(Concrete Classes)
java 复制代码
public class Coffee extends Beverage {
    @Override
    public boolean customerWantsCondiments() {
        return true;
    }

    @Override
    public void brew() {
        System.out.println("Dripping coffee through filter");
    }

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

public class GreenTea extends Beverage {
    @Override
    public boolean customerWantsCondiments() {
        return false;
    }

    @Override
    public void brew() {
        System.out.println("Steeping green tea");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding lemon");
    }
}
3. 客户端代码
java 复制代码
public class Client {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();

        System.out.println("--------------------");

        Beverage tea = new GreenTea();
        tea.prepareRecipe();
    }
}

在这个案例中,Beverage 类定义了一个制作饮料的模板方法 prepareRecipe(),它规定了制作饮料的基本步骤。CoffeeGreenTea 类继承自 Beverage 类,并根据需要重写了 brew()addCondiments() 方法。客户端代码通过创建 CoffeeGreenTea 的实例,并调用它们的 prepareRecipe() 方法来制作饮料。

输出结果将展示两种饮料的制作过程,每种饮料都有其特定的步骤和调料。这个模式使得添加新的饮料类型变得非常容易,只需创建一个新的类继承自 Beverage 并实现必要的方法即可。

相关推荐
济宁雪人1 分钟前
Java安全基础——JNI安全基础
java·开发语言
q***965813 分钟前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
h***066523 分钟前
【JSqlParser】Java使用JSqlParser解析SQL语句总结
java·开发语言·sql
代码or搬砖33 分钟前
Java Lambda 表达式全面详解
java·开发语言·python
okseekw35 分钟前
Java初学者的static探险记:原来“静态”是这么个省心玩意儿!
java
这周也會开心42 分钟前
JDK1.8新增语法
java·开发语言
心随雨下1 小时前
TypeScript泛型开发常见错误解析
java·开发语言·typescript
DonaldCen6661 小时前
Java 王者修炼手册【Mysql篇 - SQL执行存储流程】:拆解 InnoDB 存储结构与 SQL 执行流程,吃透 Buffer Pool 和 Change
java
旺仔Sec1 小时前
2025年广东省职业院校技能大赛高职组“区块链技术应用”竞赛试题(二)
java·区块链
Boop_wu1 小时前
[Java EE] 多线程编程进阶
java·数据库·java-ee