【设计模式】模板模式

什么是模板模式?

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。

Java设计模式------模板方法模式【Template Method Pattern】作者:止步前行

简单的说,我要做咖啡,有的咖啡放糖,有的放牛奶,有的啥也不放。但是放调味品之前的操作是一样的,比如清洗咖啡豆,研磨咖啡豆等等操作。

我们怎么在OOP编程中体现出来他们的相同与不同呢?

这时,就可以用到模板模式,主要思想是:
把相同的步骤写在父类当中,不同的步骤成为抽象方法,让不同的子类继承父类后,重写父类的方法。

这就实现了,相同的方法不用动,而不同的方法各自实现的需求。

代码演示

简单的模板模式

父类:

java 复制代码
public abstract class Building {

	//模板方法:做成final,不让子类去覆盖
    final void make(){
        step1();
        step2();
        step3();
        step4();
    }


     void step1(){
        System.out.println("画图纸");
    }
     void step2(){
        System.out.println("盖地基");
    }
     void step3(){
        System.out.println("往上搭");
    }
    // 抽象方法,子类继承后各自重写。
     abstract void step4();
}

子类:

java 复制代码
public class JingZiTa extends Building{
    @Override
    void step4() {
        System.out.println("搭金塔");
    }
}

Main方法:

java 复制代码
public class Client {
    public static void main(String[] args) {
        JingZiTa jingZiTa = new JingZiTa();
        jingZiTa.make();
    }
}

效果:

这就是搭金字塔的四个步骤。

进阶:带有钩子函数的模板模式

如果我想建个房子,3个步骤就够了,根本不需要第四步。怎么办?

这时,我们定义一个方法,叫做钩子函数,当子类又自定义需求时,就可以重写它。(这个函数不是必须要重写的)

父类:

java 复制代码
public abstract class Building {

    void make(){
        step1();
        step2();
        step3();
        // 进行判断,是否要执行第四步。
        if(shouldStep4()){
            step4();
        }
    }


     void step1(){
        System.out.println("画图纸");
    }
     void step2(){
        System.out.println("盖地基");
    }
     void step3(){
        System.out.println("往上搭");
    }

    /**
     * 钩子函数
     * @return 默认开启,执行第四步。
     */
    boolean shouldStep4(){
        return true;
    }
     abstract void step4();
}

子类

java 复制代码
public class JingZiTa extends Building{
    @Override
    void step4() {
        System.out.println("搭金塔");
    }

	// 返回false,不执行第四步!
    @Override
    boolean shouldStep4() {
        return false;
    }
}

Main方法

java 复制代码
public class Client {
    public static void main(String[] args) {
        JingZiTa jingZiTa = new JingZiTa();
        jingZiTa.make();
    }
}

效果:

模板模式的优缺点

优点:

  1. 最大程度的复用代码。
  2. 既统一了算法,也提供了很大的灵活性。

缺点:

每一个具体实现,都要新增一个类。造成了系统的庞大。

相关推荐
Lhappy嘻嘻4 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
科技道人4 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
伊玛目的门徒4 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇6 小时前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾8 小时前
Rust 学习目录
开发语言·学习·rust
我命由我123459 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑9 小时前
Sentinel安装
java·后端·微服务
云泽8089 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范