模板方法模式 (Template Method Pattern)

embedded/2024/11/29 7:19:45/

文章目录

      • 模板方法模式 (Template Method Pattern)
      • 原理
      • 优点
      • 缺点
      • 示例代码
        • 场景描述
        • 1. 定义抽象类
        • 2. 创建具体类
        • 3. 客户端代码
        • 输出结果
      • UML 类图
      • 钩子方法
      • 使用场景
      • 优化与扩展
      • 小结

模板方法模式 (Template Method Pattern)

模板方法模式是一种 行为型设计模式,它定义了一个操作的骨架,将具体的实现延迟到子类。通过模板方法模式,子类可以在不改变骨架的情况下重新定义某些步骤。


原理

  1. 核心思想
    • 在一个方法中定义算法的框架,将具体实现留给子类。
    • 提取公共逻辑到父类中,便于代码复用。
  2. 适用场景
    • 一些操作步骤是固定的,但某些步骤需要由子类定制。
    • 存在多个类有类似的行为,需要复用相同的逻辑。
  3. 参与角色
    • AbstractClass(抽象类):定义模板方法和抽象方法,模板方法给出逻辑骨架。
    • ConcreteClass(具体类):实现抽象方法,提供特定步骤的具体逻辑。

优点

  1. 代码复用:将通用逻辑提升到父类。
  2. 灵活扩展:子类可以灵活定制具体实现。
  3. 封装不变部分:将变化部分交由子类处理。

缺点

  1. 增加复杂性:引入了继承关系。
  2. 子类数量增加:不同实现需要创建多个子类。

示例代码

场景描述

以咖啡和茶的制作过程为例。两者的制作过程大致相同,但某些步骤不同。


1. 定义抽象类
java">// 抽象类
public abstract class Beverage {// 模板方法,定义制作流程public final void prepareBeverage() {boilWater();brew();pourInCup();if (addCondimentsHook()) { // 使用钩子方法addCondiments();}}// 通用方法:烧水private void boilWater() {System.out.println("Boiling water...");}// 通用方法:倒入杯中private void pourInCup() {System.out.println("Pouring into cup...");}// 抽象方法:冲泡protected abstract void brew();// 抽象方法:添加调料protected abstract void addCondiments();// 钩子方法:是否需要添加调料protected boolean addCondimentsHook() {return true; // 默认需要添加调料}
}

2. 创建具体类
java">// 咖啡类
public class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Brewing coffee...");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk...");}
}// 茶类
public class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping tea leaves...");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon...");}// 重写钩子方法,不需要添加调料@Overrideprotected boolean addCondimentsHook() {return false;}
}

3. 客户端代码
java">public class TemplateMethodExample {public static void main(String[] args) {System.out.println("Preparing Coffee:");Beverage coffee = new Coffee();coffee.prepareBeverage();System.out.println("\nPreparing Tea:");Beverage tea = new Tea();tea.prepareBeverage();}
}

输出结果
Preparing Coffee:
Boiling water...
Brewing coffee...
Pouring into cup...
Adding sugar and milk...Preparing Tea:
Boiling water...
Steeping tea leaves...
Pouring into cup...

UML 类图

        +----------------------+|     Beverage         |<--------------------++----------------------+                     || + prepareBeverage()  |                     || + brew()             | (Abstract Method)   || + addCondiments()    |                     || + addCondimentsHook()|                     |+----------------------+                     |^                                    ||                                    |+------------------+                  +------------------+|      Coffee      |                  |       Tea        |+------------------+                  +------------------+| + brew()         |                  | + brew()         || + addCondiments()|                  | + addCondiments()|+------------------+                  +------------------+

钩子方法

  • 钩子方法是一种可选的方法,允许子类对模板方法的某些行为进行控制。
  • 示例中,addCondimentsHook 用于决定是否添加调料。

使用场景

  1. 多个子类有类似行为:需要复用通用逻辑。
  2. 固定流程的实现:如数据处理管道、游戏回合处理等。
  3. 扩展性需求较高:新增行为只需创建子类。

优化与扩展

  1. 结合策略模式
    • 可将模板中可变部分抽取为策略,进一步提高灵活性。
  2. Spring 框架的应用

小结

  • 模板方法模式通过提取公共逻辑,增强了代码复用性。
  • 子类只需实现变化部分,避免了重复代码。
  • 在需要固定流程和灵活扩展时,模板方法模式是首选方案。

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

相关文章

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…

物联网实验室建设方案

一、物联网实验室建设 (1) 基础理论教学云平台 唯众基础理论教学云平台是一个专为物联网相关专业教学打造的综合性在线教学平台。该平台凭借先进的技术架构和丰富的教学资源&#xff0c;为师生提供了一个高效、便捷、互动的学习环境。以下是该平台的主要特点和功能描述&#…

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

本章讲述数据结构中的六大排序算法 欢迎大佬们踊跃讨论&#xff0c;感谢大家支持&#xff01; 我的博客主页链接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希尔排序 二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序 三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux&#xff1f; Linux是一种基于Unix的操作系统&#xff0c;由Linus Torvalds于1991年首次发布。Linux的核心&#xff08;Kernel&#xff09;是开源的&#xff0c;允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…

Transformer

1706.03762 目录 一、Abstract 改进&#xff1a; 二、相关工作 三、模型架构 1、编码器和解码器栈 2、Attention—注意力机制 2.1 Scaled DotProduct Attention 2.2 MultiHead Attention—多头注意力机制 2.3 Applications of Attention in our Model&#xff08;注意力…

Servlet的应用(用户注册界面)

表单提交到后台 Servlet&#xff1a;当用户填写完表单并点击注册按钮时&#xff0c;表单数据应该通过 POST 方式提交给后台。后台 Servlet 处理表单数据&#xff1a;Servlet 会处理从表单接收到的用户数据&#xff0c;进行验证和注册操作。正确显示中文用户名&#xff1a;在后台…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)

相信实验一大家已经完成了&#xff0c;对Arcgis已进一步熟悉了&#xff0c;现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…

DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程

本文仅做测评体验&#xff0c;非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室&#xff08;Black Forest Labs&#xff09;开发的开源AI图像生成模型。它拥有12…