模板方法模式

模板方法模式

1. 概述

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板 。它的子类可以按需要重写方法实现。但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式

2. 意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定功能。

3. 炒菜案例:

定义一个炒菜的抽象类,抽象方法中规定炒菜的步骤

复制代码
分析:
 1.取材
 2.处理食材
 3.起锅烧油
 4.放入食材
 5.翻炒
 6.放入各种调料
 7.翻炒均匀
 8.出锅

4. 代码

  • 炒菜的抽象类
java 复制代码
public abstract class StirFry {
    //定义炒菜步骤抽象方法,该方法用final修饰,使其不能被修改
  public  final void stirFry(){
      //1.取材
      drawMaterials();
      // 2.处理食材
      processingIngredients();
      // 3.起锅烧油
      boilOilInAPot();
      // 4.放入食材
      addIngredients();
      // 5.翻炒
      fanChao();
      // 6.放入各种调料
      putTiaoLiao();
      // 7.翻炒均匀
      junYun();
      // 8.出锅
      outPot();
  }
  //1.取材
   abstract void drawMaterials();
    // 2.处理食材
    abstract void processingIngredients();
    // 3.起锅烧油
    void boilOilInAPot(){
        System.out.println("起锅烧油");
    }
    // 4.放入食材
    void addIngredients(){
        System.out.println("放入食材");
    }
    // 5.翻炒
    void fanChao() {
        System.out.println("翻炒");
    }
    // 6.放入各种调料
     abstract void putTiaoLiao();
    // 7.翻炒均匀
    void junYun() {
        System.out.println("翻炒均匀");
    }
    // 8.出锅
    void outPot(){
        System.out.println("出锅");
    }
}
  • 西红柿炒鸡蛋的具体实现类
java 复制代码
public class ScrambledEggWithTomato extends StirFry{
    @Override
    void drawMaterials() {
        System.out.println("准备番茄和鸡蛋");
    }
    @Override
    void processingIngredients() {
        System.out.println("处理番茄和鸡蛋");
    }
    @Override
    void putTiaoLiao() {
        System.out.println("放入盐和味精");
    }
}
  • 测试
java 复制代码
public class Test {
    public static void main(String[] args) {
        ScrambledEggWithTomato scrambledEggWithTomato=new ScrambledEggWithTomato();
        scrambledEggWithTomato.stirFry();
    }
}

5. 优点

​ 1、封装不变部分,扩展可变部分。

​ 2、提取公共代码,3.便于维护。

​ 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

​ 1、有多个子类共有的方法,且逻辑相同

​ 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

6. 应用

模板方法模式在框架源码中使用也很广泛,比如:

  • JDK源码中 AbstractList抽象类
  • Mybatis源码中 BaseExecutor抽象类

7. 钩子方法的主要目的:

目的是干预执行流程,正确使用钩子方法可以使得子类控制父类的行为。

相关推荐
未秃头的程序猿2 小时前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
雨中飘荡的记忆3 小时前
深入理解设计模式之单例模式
java·设计模式
8***29314 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你13 小时前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing18 小时前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白18 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科19 小时前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记19 小时前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
ada0_ada120 小时前
行为型模式:②命令模式(Command Pattern)
设计模式
o0向阳而生0o21 小时前
113、23种设计模式之中介者模式(21/23)
设计模式·中介者模式