模板方法模式

模板方法模式

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 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
冰茶_4 小时前
C#中常见的设计模式
java·开发语言·microsoft·设计模式·微软·c#·命令模式
Niuguangshuo4 小时前
Python 设计模式:访问者模式
python·设计模式·访问者模式
不当菜虚困5 小时前
JAVA设计模式——(七)代理模式
java·设计模式·代理模式
RationalDysaniaer6 小时前
Go设计模式-观察者模式
观察者模式·设计模式·golang
千千寰宇7 小时前
[设计模式/Java] 设计模式之解释器模式【27】
数据库·设计模式
麓殇⊙7 小时前
设计模式-- 原型模式详解
设计模式·原型模式
电子科技圈7 小时前
XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
经验分享·设计模式·性能优化·计算机外设·音视频
智想天开8 小时前
11.原型模式:思考与解读
设计模式·原型模式
XiaoLeisj8 小时前
【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现
java·spring boot·后端·spring·设计模式·代理模式·委托模式