设计模式-模板方法实现

文章目录

    • 模式结构
    • 模式特点
    • 示例代码
    • 输出结果
    • 关键点解析
    • 模式的优缺点
    • 使用场景
    • 总结

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将某些步骤的实现延迟到子类中。通过这种方式,模板方法模式可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤

模式结构

模板方法模式的结构包括以下几个关键部分:

  1. 抽象类(Abstract Class):定义算法的骨架,并包含一个或多个抽象方法,留给子类实现
  2. 具体子类(Concrete Class):实现抽象类中的抽象方法,完成具体的算法步骤
  3. 模板方法(Template Method):在抽象类中定义的具体方法,按照一定的步骤调用抽象方法,确保算法的整体结构

模式特点

  • 封装不变部分,扩展可变部分:算法的骨架固定在抽象类中,具体实现细节由子类完成
  • 遵循开闭原则:新增功能时,只需扩展子类,而不需要修改抽象类
  • 减少代码重复:公共逻辑封装在抽象类中,避免子类重复实现

示例代码

以下是一个使用模板方法模式的示例:制作饮品的过程

// 抽象类:饮品制作流程
abstract class Beverage {
    // 模板方法:定义饮品制作的算法骨架
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            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 customerWantsCondiments() {
        return true;
    }
}

// 具体类:制作茶
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the tea.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding lemon.");
    }
}

// 具体类:制作咖啡
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Dripping coffee through filter.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding sugar and milk.");
    }
}

// 测试代码
public class TemplateMethodExample {
    public static void main(String[] args) {
        System.out.println("Making tea:");
        Beverage tea = new Tea();
        tea.prepareRecipe();

        System.out.println("\nMaking coffee:");
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

输出结果

Making tea:
Boiling water.
Steeping the tea.
Pouring into cup.
Adding lemon.

Making coffee:
Boiling water.
Dripping coffee through filter.
Pouring into cup.
Adding sugar and milk.

关键点解析

  1. 模板方法的作用
    • prepareRecipe() 是模板方法,定义了制作饮品的固定流程。
    • 子类通过实现 brew()addCondiments() 方法,提供具体的制作细节。
  2. 钩子方法的灵活性
    • 钩子方法 customerWantsCondiments() 提供了默认实现,子类可以选择性地覆盖它来改变行为。
  3. 防止子类修改流程
    • 模板方法通常使用 final 修饰,防止子类改变算法骨架。

模式的优缺点

优点:

  1. 代码复用:将通用代码封装在抽象类中,减少重复代码。
  2. 灵活扩展:子类可以通过实现或重写方法定制具体行为。
  3. 清晰的流程控制:模板方法明确了算法的步骤和执行顺序。

缺点:

  1. 类的数量增加:每个具体实现都需要定义一个子类,可能导致类的数量增多。
  2. 继承的限制:模板方法模式依赖继承,可能降低灵活性,子类之间存在强耦合。

使用场景

模板方法模式适用于以下场景:

  1. 具有固定流程的操作:算法的步骤固定,但某些步骤的实现可能变化。
  2. 复用公共逻辑:多个子类有相同的操作步骤,可以抽取到抽象类中。
  3. 需要灵活扩展的流程:通过钩子方法和抽象方法,子类可以灵活定制行为。

总结

模板方法模式通过将算法的骨架固定在抽象类中,确保了流程的稳定性,同时允许子类定制具体实现,达到了复用与扩展的平衡。它是一种经典的设计模式,广泛应用于框架设计、业务流程管理等场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时,是在地址:端口/Controller名称进行访问的,这个时候Controller的默认路由配置如下 访问接口时,是通过请求方法(GET、Post、Put、Delete)进行接口区分的&…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上,这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

一部手机如何配置内网电脑同时访问内外网

做过运维的朋友都知道,最麻烦的是运维电脑不能远程,每次都得现场进行维护,明明客户那边有可以访问内网的电脑,怎么操作能将这台电脑能访问跟到外网呢,这样不就能通过远程软件远程了吗?嘿嘿。按以下步骤试试…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

(三)线性代数之二阶和三阶行列式详解

在前端开发中,尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里,行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面,我将结合具…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

【EdgeAI实战】(1)STM32 边缘 AI 生态系统

【EdgeAI实战】(1)STM32 边缘 AI 生态系统 【EdgeAI实战】(1)STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…

DeepSeek-R1性能如何?如何使用DeepSeek-R1和o1 Pro模型

我们一起来看看DeepSeek-R1模型和OpenAI o1模型的能力如何?接下来,我们先看数据结果,然后再实际体验,我们今天就让他们写个python爬虫脚本来爬取所有有关孙颖莎和樊振东的相关报道和图片。 DeepSeek-R1 DeepSeek介绍自己说 &quo…

FunASR语言识别的环境安装、推理

目录 一、环境配置 1、创建虚拟环境 2、安装环境及pytorch 官网:pytorch下载地址 3、安装funasr之前,确保已经安装了下面依赖环境: python代码调用(推荐) 4、模型下载 5、启动funasr服务 二、 客户端连接 2.1 html连接 …

【Elasticsearch】 Ingest Pipeline `processors`属性详解

在Elasticsearch中,Ingest Pipeline 的 processors 属性是一个数组,包含一个或多个处理器(processors)。每个处理器定义了一个数据处理步骤,可以在数据索引之前对数据进行预处理或富化。以下是对 processors 属性中常见…

架构思考与实践:从通用到场景的转变

在当今复杂多变的商业环境中,企业架构的设计与优化成为了一个关键议题。本文通过一系列随笔,探讨了业务架构的价值、从通用架构到场景架构的转变、恰如其分的架构设计以及如何避免盲目低效等问题。通过对多个实际案例的分析,笔者揭示了架构设…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

win32汇编环境,怎么得到磁盘的盘符

;运行效果 ;win32汇编环境,怎么得到磁盘的盘符 ;以下代码主要为了展示一下原理,应用GetLogicalDrives、GetLogicalDriveStrings函数、屏蔽某些二进制位、按双字节复制内容等。以下代码最多查8个盘,即返回值中的1个字节的信息 ;直接抄进RadAsm可编译运行。…

微软预测 AI 2025,AI Agents 重塑工作形式

1月初,微软在官网发布了2025年6大AI预测,分别是:AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是,微…

网络编程套接字(二)

目录 TCP网络程序 服务端初始化 创建套接字 服务端绑定 服务端监听 服务端启动 服务端获取连接 服务端处理请求 客户端初始化 客户端启动 发起连接 发起请求 网络测试 多进程版TCP网络程序 捕捉SIGCHLD信号 孙子进程提供服务 多线程版TCP网络程序 线程池版TC…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…

渗透测试--攻击常见的Web应用

本文章咱主要讨论,常见Web应用的攻击手法,其中并不完全,因为Web应用是在太多无法囊括全部,但其中的手法思想却值得我们借鉴,所以俺在此做了记录,希望对大家有帮助!主要有以下内容: 1…

外包公司名单一览表(成都)

大家好,我是苍何。 之前写了一篇武汉的外包公司名单,评论区做了个简单统计,很多人说,在外包的日子很煎熬,不再想去了。 有小伙伴留言说有些外包会强制离职,不行就转岗,让人极度没有安全感。 这…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…

Spring Boot安全加固:基于Spring Security的权限管理

引言 在当今数字化时代,随着企业信息化程度的不断提高,应用程序的安全性成为了一个至关重要的问题。Spring Boot 作为 Java 生态系统中广泛使用的开发框架,以其简洁、高效的特点深受开发者的喜爱。然而,仅仅依靠 Spring Boot 的默…