模板方法模式

模板方法模式

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. 钩子方法的主要目的:

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

相关推荐
Jack_hrx2 分钟前
Java 设计模式之桥接模式(Bridge Pattern)
java·设计模式·桥接模式·bridge pattern
like4553 小时前
设计模式-策略模式
java·开发语言·设计模式·策略模式
csdn_girl6 小时前
设计模式的概念
开发语言·设计模式
RookiaManager6 小时前
模板方法模式
模板方法模式
小王不头秃6 小时前
【设计模式】六大原则-上
java·开发语言·设计模式
GeniusAng丶6 小时前
OOP经典设计模式
c++·设计模式·oop
鲤籽鲲7 小时前
C# 设计模式之外观模式
设计模式·c#·外观模式
A22747 小时前
十一、外观模式
java·设计模式·外观模式
正在走向自律8 小时前
Java二十三种设计模式-组合模式(11/23)
java·设计模式·组合模式
鲤籽鲲8 小时前
C# 设计模式之适配器模式
设计模式·c#·适配器模式