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 并实现必要的方法即可。

相关推荐
CHQIUU11 分钟前
Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
java·单例模式·设计模式
碎梦归途14 分钟前
23种设计模式-结构型模式之享元模式(Java版本)
java·开发语言·jvm·设计模式·享元模式
lozhyf33 分钟前
Eureka搭建
java·spring cloud
Pasregret41 分钟前
模板方法模式:定义算法骨架的设计模式
算法·设计模式·模板方法模式
幽络源小助理43 分钟前
SpringBoot民宿管理系统开发实现
java·spring boot·springboot·民宿系统
东阳马生架构1 小时前
Nacos简介—1.Nacos使用简介
java
爱发飙的蜗牛1 小时前
springboot--web开发请求参数接收注解
java·spring boot·后端
码熔burning1 小时前
【MQ篇】RabbitMQ之工作队列模式!
java·分布式·rabbitmq·mq
优雅的落幕1 小时前
Spring--统一数据返回格式与统一异常处理
java·spring·状态模式
zhaoyqcsdn1 小时前
抽象工厂模式及其在自动驾驶中的应用举例(c++代码实现)
c++·经验分享·笔记·设计模式