模板方法模式
创始人
2024-05-31 15:34:18
0

介绍

​ Java中的模板方法模式是一种行为设计模式,用于定义算法的框架并允许子类重写某些步骤,同时不改变算法的结构.

​ 该模式基于开放/关闭原则,即对扩展开放,对修改关闭,在模板方法模式中,父类定义了一个算法的骨架,而子类可以通过实现父类的抽象方法,来自定义某些步骤的行为,整个算法步骤不会因为子类的改变而改变

​ 模板方法模式通常包括一个抽象类和若干个具体子类,抽象类中定义了算法的框架,包括一些基本的方法和一个模板方法.模板方法是一个模板,其中包含了算法的步骤,每个步骤都有一个抽象方法或一个默认方法实现,具体的子类可以通过实现这些抽象方法来实现自己的行为.

​ 抽象类中还可以有钩子函数,钩子函数通常是抽象类中的虚函数,其默认实现为空,这样子类可以选择覆盖该函数来实现特定的行为.在模板方法模式中,钩子函数通常用于在算法的某些特定步骤中进行特定的操作或检查条件.钩子函数的另一个用途是提供一种扩展算法的方法,子类可以通过覆盖钩子函数来添加额外的步骤或者修改算法的行为.总之钩子函数是模板方法模式中的一个重要概念,可以用来影响算法的行为或者扩展算法的功能.

实现

首先定义咖啡抽象类

package com.fanqiechaodan.templatemethod;/*** @author fanqiechaodan* @Classname CoffeeMaker* @Description 咖啡抽象类* @Date 2023/3/9 18:50*/
public abstract class CoffeeMaker {public final void makeCoffee() {boilWater();brewCoffee();pourInCup();if (isCondiments()) {addCondiments();}}private void boilWater() {System.out.println("煮水");}protected abstract void brewCoffee();private void pourInCup() {System.out.println("倒入杯子中");}/*** 钩子函数;是否加入调料,由子类决定是否重写** @return*/protected boolean isCondiments() {return true;}protected abstract void addCondiments();
}

其次定义两个具体子类

public class AmericanoMaker extends CoffeeMaker{@Overrideprotected void brewCoffee() {System.out.println("冲泡美式咖啡");}@Overrideprotected void addCondiments() {System.out.println("加入牛奶和糖");}/*** 钩子函数;是否加入调料,由子类决定是否重写** @return*/@Overrideprotected boolean isCondiments() {return false;}
}public class LatteMaker extends CoffeeMaker{@Overrideprotected void brewCoffee() {System.out.println("冲泡浓缩咖啡");}@Overrideprotected void addCondiments() {System.out.println("添加奶泡和焦糖酱");}
}

测试

package com.fanqiechaodan.templatemethod;/*** @author fanqiechaodan* @Classname Demo* @Description 模板方法模式* @Date 2023/3/9 18:57*/
public class Demo {public static void main(String[] args) {CoffeeMaker americanoMaker = new AmericanoMaker();americanoMaker.makeCoffee();System.out.println();CoffeeMaker latteMaker = new LatteMaker();latteMaker.makeCoffee();}
}

在这里插入图片描述

总结

优点

  • 提高代码复用性:模板方法模式将通用算法代码封装在父类中,子类只需要特定的方法即可,从而提高了代码的复用性.
  • 保证算法结构的一致性:模板方法模式规定了算法的基本流程和结构,确保所有子类实现的算法结构一致,从而提高了代码的可维护性和可扩展性.
  • 降低代码耦合度:通过将具体实现细节封装在子类中,父类与子类之间的耦合度降低,提高了代码的灵活性和可扩展性.

缺点

  • 可能会导致类的数量增加:使用模板方法模式需要定义抽象类和具体实现类,这可能会导致类的数量增加,从而增加代码的复杂度.
  • 限制子类的灵活性:模板方法规定了算法的基本流程和结构,子类需要按照这个结构去实现,这可能会限制子类的灵活性.

应用场景

  • 当我们需要定义一个算法骨架结构,从而具体实现细节可以在子类中进行定义时,可以使用模板方法模式.
  • 当我们需要一些复杂的算法分解为一系列简单的步骤,并且这些步骤的顺序和流程都是固定的时,可以使用模板方法模式
  • 当我们需要在多个子类中共享一些公共的代码时,可以使用模板方法模式,将这些公共的代码封装在父类中.

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...