模板方法模式:定义算法骨架,子类实现具体步骤

embedded/2024/10/18 22:32:37/

在软件开发中,经常会遇到一些算法或过程,它们的总体步骤是固定的,但在某些步骤上可能会有不同的实现。模板方法模式是一种行为型设计模式,它在超类中定义了一个算法的骨架,将一些步骤延迟到子类中实现。这种模式允许子类在不改变算法结构的前提下,重新定义算法的某些特定步骤。

模板方法模式的结构

模板方法模式包含以下几个关键组件:

  1. 抽象类(Abstract Class):定义了模板方法和一些基本的方法。
  2. 模板方法(Template Method):在抽象类中定义的算法骨架,它通常包含一系列步骤的调用。
  3. 基本方法(Basic Method):构成算法骨架的步骤,可以是具体实现的,也可以是抽象的,需要子类实现。
  4. 钩子方法(Hook Method):在抽象类中定义的方法,它在模板方法中被调用,可以被子类重写以影响模板方法的行为。
  5. 具体子类(Concrete Classes):实现抽象类中定义的抽象方法,继承并使用模板方法。

模板方法模式的实现

以下是一个简单的Java实现示例:

java">// 抽象类
abstract class CoffeeShop {// 模板方法定义算法骨架public final void makeCoffee() {boilWater();brewCoffee();pourInCup();addCondiments();}// 基本方法:煮沸水protected abstract void boilWater();// 基本方法:冲泡咖啡protected abstract void brewCoffee();// 基本方法:倒入杯子private void pourInCup() {System.out.println("Pouring coffee into a cup.");}// 钩子方法:添加调料protected void addCondiments() {System.out.println("Adding sugar and milk.");}
}// 具体子类:美式咖啡
class Americano extends CoffeeShop {@Overrideprotected void boilWater() {System.out.println("Boiling water for Americano.");}@Overrideprotected void brewCoffee() {System.out.println("Brewing Americano coffee.");}
}// 具体子类:拿铁
class Latte extends CoffeeShop {@Overrideprotected void boilWater() {System.out.println("Boiling water for Latte.");}@Overrideprotected void brewCoffee() {System.out.println("Brewing Latte coffee.");}@Overrideprotected void addCondiments() {System.out.println("Adding milk foam.");}
}// 客户端代码
public class Client {public static void main(String[] args) {CoffeeShop shop = new Americano();shop.makeCoffee(); // 制作美式咖啡shop = new Latte();shop.makeCoffee(); // 制作拿铁}
}

在这个例子中,CoffeeShop是一个抽象类,它定义了制作咖啡的模板方法makeCoffee,以及一些基本方法和钩子方法。AmericanoLatte是具体子类,它们实现了抽象类中定义的抽象方法,并根据需要重写了钩子方法。

模板方法模式的应用场景

  • 算法相似:当多个类执行相似的算法,但有几步实现不同。
  • 控制子类扩展:当不希望子类改变算法的整体结构,但允许它们重新定义某些步骤。
  • 复用代码模板方法模式可以提高代码的复用性,减少重复代码。

模板方法模式的优点

结论

模板方法模式是一种强大的设计模式,它通过定义算法骨架,允许子类在不改变算法结构的前提下,重新定义算法的某些步骤。这种模式在实现算法的可扩展性方面非常有用,尤其是在算法的整体结构确定,但某些步骤需要变化时。在实际开发中,模板方法模式常用于实现算法的骨架,而将具体实现留给子类。掌握模板方法模式,可以帮助开发者更好地设计灵活且可扩展的软件系统。


http://www.ppmy.cn/embedded/17028.html

相关文章

LeetCode in Python 48. Rotate Image/Matrix (旋转图像/矩阵)

旋转图像/矩阵的重点是寻找旋转前后对应位置的坐标关系。 示例: 图1 旋转图像/矩阵的输入输出示意图 代码: class Solution:def rotate(self, matrix):n len(matrix)for i in range(n // 2):for j in range(i, n - 1 - i):topleft matrix[i][j]ma…

面试:JVM内存结构

一、Java代码的运行步骤 一段Java代码先会被反编译为Java字节码,当执行java命令时,JVM虚拟机会被创建出来,并会创建一个main主线程来执行主方法。 二、JVM的内存结构有哪些? 1、方法区:(线程共享&#xff…

opengles在车载360环视avm系统中的应用简介

360环视是辅助驾驶系统的一个技术点,通过鱼眼相机模型标定,图像拼接,鸟瞰图生成,3d渲染等手段把车体周围图像经过3D渲染后,生成2D鸟瞰图和3D环视图,在中控屏幕上显示,用于辅助倒车等。其具体的技…

【C++ STL序列容器】list 双向链表

文章目录 【 1. 基本原理 】【 2. list 的创建 】2.1 创建1个空的 list2.2 创建一个包含 n 个元素的 list(默认值)2.3 创建一个包含 n 个元素的 list(赋初值)2.4 通过1个 list 初始化另一个 list2.5 拷贝其他类型容器的指定元素创…

抖音智能运营系统源码

这是一个一站式服务的抖音智能运营系统,旨在提升内容创作者和营销人员的工作效率。它是一个综合性的在线服务平台,专为抖音内容创作者和营销人员设计。系统基于高性能、可扩展性强的ThinkPHP框架,整合了视频处理、数据分析、文案生成与配音等…

react 封装请求axios,直接调用即可

概要 我们在开发项目的时候,常常会遇到接口请求的问题的,若我们不进行接口的统一管理,代码开发不仅多而且很麻烦容易出错,也不利于项目的维护。下面我们一下学习下react项目中将如何封装请求,也从另一个方面中少写一些…

pip下载包opencv出错(报错failed building wheel for opencv-python解决方法)

文章目录 1 报错2 原因3 解决方法参考 1 报错 ERROR: Could not build wheels for opencv-python, which is required to install pypr2 原因 版本不兼容的问题,当使用pip install opencv-python命令安装的是最新版本,当前python版本不支持。需要安装当前版本pyth…

WPF2022终结版系列课程笔记 1 WPF 基本布局

本笔记为B站 微软系列技术教程 WPF项目实战合集(2022终结版) 项目记录 WPF 基本布局 WPF布局原则 一个窗口中只能包含一个元素 不应显示设置元素尺寸 不应使用坐标设置元素的位置 可以嵌套布局容器 WPF布局容器 StackPanel: 水平或垂直排列元素、Orientation属性分别: Hor…