当前位置: 首页 > article >正文

java 设计模式 模板方法模式

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

springcloudalibaba地址:

https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112

springboot地址:

https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112

springboot+vue案例地址:

https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112

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

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

简单案例:制作饮料

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

1. 定义抽象类(Abstract Class)
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)
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. 客户端代码
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 并实现必要的方法即可。


http://www.kler.cn/a/405130.html

相关文章:

  • 深入理解 Spring Boot 的 CommandLineRunner 原理及使用
  • SpringBoot(8)-任务
  • nginx代理解决跨域问题CORS错误
  • SpringCloud多机部署,负载均衡-LoadBalance
  • 上海市计算机学会竞赛平台2022年8月月赛丙组屏幕比例
  • 如何在 RK3568 Android 11 系统上排查以太网问题
  • shell脚本-笔记25
  • leetcode105:从前序与中序遍历构建二叉树
  • Java API 学习指南:从入门到精通的全面指导
  • 2.13 转换矩阵
  • 【数据库知识】mysql进阶-Mysql数据库的主从复制
  • Spring Boot核心概念:日志管理
  • SAP FICO 资产会计AA后台配置 (上)
  • PHP顺序查找和二分查找(也叫做折半查找)算法
  • Block Successive Upper Bound Minimization Method(BSUM)算法
  • Android 使用 LiveData/OnCheckedChangeListener 来监听变量变化
  • C++ 并发专题 - 线程安全的单例模式
  • Apache Maven简介
  • 给机器装上“脑子”—— 一文带你玩转机器学习
  • 博导的角度看,EtherNet/IP转Profinet网关的技术实现和区别
  • 基于Java Springboot社区便民服务管理系统
  • 移动零
  • CircuitBreaker机制详解:Elasticsearch中的资源管理
  • 【GIT】TortoiseGit的变基(Rebase)操作
  • Easyexcel(1-注解使用)
  • 什么是MuLogin虚拟浏览器配置文件?它们有什么作用?