模板方法模式

模板方法模式

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

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

相关推荐
lxyzcm6 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千6 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)6 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲8 小时前
设计模式——桥接模式
设计模式·桥接模式
捕鲸叉12 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
小小小妮子~12 小时前
框架专题:设计模式
设计模式·框架
先睡12 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Damon_X21 小时前
桥接模式(Bridge Pattern)
设计模式·桥接模式
越甲八千1 天前
重温设计模式--享元模式
设计模式·享元模式
码农爱java1 天前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式