23种设计模式之模板方法模式

目录

  • 1. 简介
  • 2. 代码
    • 2.1 AClass (抽象类)
    • 2.2 DesignPatternClass (具体实现类)
    • 2.3 H5Class (具体实现类)
    • 2.4 Test (测试)
    • 2.5 运行结果
  • 3. 使用场景
  • 4. 优缺点
  • 5. 总结

1. 简介

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

  • 结构组成
    • 抽象类(Abstract Class):这是模板方法模式的核心部分。抽象类中定义了一个模板方法,这个模板方法包含了算法的骨架,它按照一定的顺序调用其他的抽象方法和具体方法。抽象方法是一些没有具体实现的方法,这些方法的实现会在子类中完成。具体方法是已经有具体实现的方法,它们在模板方法的算法流程中扮演着固定的角色。
    • 具体子类(Concrete Subclass):具体子类继承自抽象类,它们实现了抽象类中的抽象方法。通过实现这些抽象方法,具体子类可以改变模板方法中某些步骤的具体行为,从而在遵循模板方法所定义的算法骨架的基础上,实现具有不同特性的算法。

2. 代码

2.1 AClass (抽象类)

public abstract class AClass {protected final void makeClass(){if(flag()){this.makeNote();this.isMakeNote();}this.makePPT();this.makeVideo();}protected final void makePPT(){System.out.println("Making PPT");}protected final void makeNote(){System.out.println("Making Note");}protected final void makeVideo(){System.out.println("Making Video");}protected boolean flag(){return false;}public abstract void isMakeNote();
}

2.2 DesignPatternClass (具体实现类)

public class DesignPatternClass extends AClass{private boolean flag;public DesignPatternClass(boolean flag) {this.flag = flag;}@Overridepublic boolean flag() {return this.flag;}@Overridepublic void isMakeNote() {System.out.println("制作源码的笔记");}}

2.3 H5Class (具体实现类)

public class H5Class extends AClass{private boolean flag;public H5Class(boolean flag) {this.flag = flag;}@Overrideprotected boolean flag() {return flag;}@Overridepublic void isMakeNote() {System.out.println("H5Class is not make note");}
}

2.4 Test (测试)

public class Test {public static void main(String[] args) {System.out.println("Start DesignPattern------");AClass aClass = new DesignPatternClass(true);aClass.makeClass();System.out.println("Start H5-----------------");AClass H5Class = new H5Class(false);H5Class.makeClass();}
}

2.5 运行结果

Start DesignPattern------
Making Note
制作源码的笔记
Making PPT
Making Video
Start H5-----------------
Making PPT
Making Video

3. 使用场景

  • 框架开发:在框架开发中,模板方法模式被广泛应用。例如,在一个 Web 框架中,处理 HTTP 请求的流程可以被定义为一个模板方法。框架可以在抽象类中定义请求处理的一般步骤,如接收请求、验证请求、执行核心业务逻辑、返回响应等。具体的业务逻辑处理部分可以通过抽象方法留给具体的业务子类去实现,这样就可以在不改变框架请求处理流程的基础上,方便地实现不同的业务功能。
  • 算法框架构建:当需要构建一个算法框架,其中部分步骤是固定的,而部分步骤可能因具体情况而不同时,模板方法模式是很好的选择。例如,在一个排序算法框架中,数据的比较操作可能是固定的,但是数据的读取和存储方式可能因数据来源和存储介质的不同而不同。可以在抽象类中定义排序算法的骨架,包括比较、交换等基本操作,而将数据读取和存储的操作通过抽象方法留给子类实现。

4. 优缺点

  • 优点
    • 代码复用性高:模板方法模式通过将算法的骨架定义在抽象类中,把公共的步骤和行为提取出来,使得这些代码可以被多个子类复用,减少了代码的重复编写。
    • 可维护性和扩展性好:由于算法的结构在抽象类中已经确定,当需要修改算法的整体流程时,只需要在抽象类中修改模板方法即可。而当需要添加新的具体实现时,只需要创建一个新的子类,实现抽象类中的抽象方法,就可以很容易地在不改变原有代码结构的基础上进行扩展。
  • 缺点
    • 子类的限制:子类必须遵循抽象类中定义的模板方法的算法结构,这在一定程度上限制了子类的灵活性。如果子类需要对算法结构进行较大的改变,可能需要重新设计整个继承关系。
    • 模板方法的复杂性:随着模板方法中步骤的增多和复杂程度的增加,模板方法本身可能会变得比较复杂,理解和维护起来可能会有一定的难度。

5. 总结

用一个抽象类做模板,其他实现必须继承它,来实现抽象方法。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于单片机的输液速度监控系统设计

本设计是以STM32F103C8T6单片机为控制核心,用户可通过按键模块来设置液体高度与点滴速度的阈值,采用液位传感器实时监测瓶内液体位置,若液位低于所设阈值,蜂鸣器进行声音报警提醒患者或医生。采用步进电机通过控制输液管直径大小从…

河工oj新生周赛第八周2024

A.小七的作业 小柒的作业 - 问题 - 软件学院OJ 代码 #include<bits/stdc.h> using namespace std;int main() {string s;cin >> s;int l, r;cin >> l >> r;string str s.substr(l,r-l1);cout << str;return 0; } B.小七的签到题 小柒的签到…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

低功耗蓝牙模块在高尔夫测距仪上的应用

在绿意盎然的高尔夫球场上&#xff0c;每一次挥杆都承载着球员对精准与完美的追求。随着科技的飞速发展&#xff0c;高尔夫运动也迎来了智能化的革新。一款集成了先进蓝牙模组的高尔夫测距仪&#xff0c;它不仅重新定义了高尔夫运动的测距精度&#xff0c;更以无线互联的便捷性…

如何在 cPanel 中创建子域名:分步指南

cPanel 是一个用于管理网站的工具&#xff0c;操作界面简单直观&#xff0c;常用于管理网站的各种功能&#xff0c;包括创建子域名。很多知名的网络服务提供商&#xff0c;如 Hostease&#xff0c;都提供了 cPanel 管理工具。 本文将详细介绍如何在 cPanel 中创建子域名&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

Linux安装BellSoft JDK 17 LTS

原来使用的OpenJdk&#xff0c;看到SpringBoot官网推荐&#xff08;如下图&#xff09;贝尔实验室的JDK&#xff0c;打算换一下 官方下载链接 JKD下载 可以看到Win、Mac、Linux都提供了&#xff0c;并且还有x86架构和arm架构的 在Linux中我们可以使用 uname -a 查看当前操作系…

C++(九)

前言&#xff1a; 本文主要讲述运算符的优先顺序。 一&#xff0c;运算符的优先级。 请看以下表达式&#xff1a; a32*5 运算结果为&#xff1a;13. 可以看到&#xff0c;在此代码中&#xff0c;先运行了2*5的结果&#xff0c;在此基础上在进行3操作&#xff0c;因此结果…

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

嵌入式入门Day25

数据结构Day 6,IO Day1 查找算法顺序查找折半查找&#xff08;二分查找&#xff09;哈希查找 IO概念标准IO创建递归索引&#xff08;用于查询结构体定义&#xff09; 文件IO标准IO缓冲区指针相关函数 查找算法 顺序查找 关键字&#xff1a;分为主关键字和次关键字主关键字&am…

内网代理转发工具

概念区分 端口转发 端口转发就是将一个端口&#xff0c;这个端口可以本机的端口也可以是本机可以访问到的任意主机的端口&#xff0c;转发到任意一台可以访问到的IP上&#xff0c;通常这个IP是公网IP。 适用端口转发的网络环境有以下几种&#xff1a; 服务器处于内网&#x…

MNIST_FC

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…

算法之括号匹配中最长有效字符串

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 任何一个左括号都能找到和其正确配对的右括号任何一个右括号都能找到和其正确配对的左括号 求最长的有效的括号长度 2. 解释 例如&#xff0c;这里的括号 ((((()()()()()()()))()最长有效是&#xff1a;((()()()()()()(…

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源&#xff1a;统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构&#xff1a;X86&#xff08;海光C86-3G 3350&#xff09; OS版本信息&#xff1a;1070桌面专业版 软件信息&#xff1a;postgresql-14.2postgis-3.2 …

【书生大模型实战营】Python 基础知识-L0G2000

前言&#xff1a;本文是书生大模型实战营系列的第2篇文章&#xff0c;是入门岛的第二个任务&#xff0c;主题为&#xff1a;Python基础知识。 官方教程参考链接&#xff1a;Tutorial/docs/L0/Python at camp4 InternLM/Tutorial 1.任务概览 本关为Python基础关卡&#xff0…

智能安全新时代:大语言模型与智能体在网络安全中的革命性应用

一、引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益严重&#xff0c;成为各行各业面临的重大挑战。传统的安全防护措施已难以应对日益复杂的网络威胁&#xff0c;人工智能&#xff08;AI&#xff09;技术的引入为网络安全带来了新的希望。特别是大语言模型&#xff…

数仓技术hive与oracle对比(三)

更新处理 oracle使用dblink透明网关连接其他数据库&#xff0c;mysql、sqlserver、oracle&#xff0c;然后用sql、plsql更新数据&#xff1b;或者使用etl工具实现更新。 hive使用sqoop连接mysql、sqlserver、oracle实现数据更新。 oracle oracle数据加载命令 批量sql脚本上…

在 Vue.js 中使用对象映射和枚举类型

学习啦&#xff01; 对象映射是一种将一个对象的属性名映射到另一个对象的属性名的方法。 const keyMapping {username: 用户名, gender: { label: 性别, mapping: gender }, // gender 映射为 性别email: 邮箱, // email 映射为 邮箱phone: 电话, // phone 映射为 电话addres…

嵌入式学习(15)-stm32通用GPIO模拟串口发送数据

一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间&#xff1b;发送8位数据&#xff1b;拉高一个波特率的时间。 三、代码 …