模板方法模式

模板方法模式

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

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

相关推荐
wrx繁星点点3 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干5 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨5 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉14 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点15 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰15 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus15 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵15 小时前
设计模式-迭代器
设计模式
lexusv8ls600h17 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc19 小时前
抽象工厂模式
java·设计模式·抽象工厂模式