常用设计模式系列(十四)—模板方法模式

第一节

前言

之前我完成了创建型设计模式和结构型设计模式,我们今天将踏入设计模式的第三章:行为型设计模式,你是否还记得什么是行为型设计模式吗?行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。今天开始讲解第一篇,模板方法模式,所谓模板,就是定义相同的模板规范,去构建固定行为与可扩展行为,每个可扩展行行为可以有自己的特点。

第二节

模板方法模式

模板方法模式(Template
Method):一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

个人理解(Person
Understand):抽象类可以定义一些普通方法及抽象方法,普通方法按照自己的规范进行定义即定义流程,但是流程中的每个步骤都可以在子节点进行特例化处理,在上层定义规范,在下层在规范的基础上进行特殊化处理。

模板方法模式构成:

在这里插入图片描述

在这里插入图片描述

小杨同学入职后,需要去银行办理一张工资卡,来到银行后,银行提供了两种办卡方式,第一为人工办理、第二种为机器自助办理,可根据自己的选择完成办卡。办卡流程为:填写个人身份信息、人像识别、密码设置、签名留存。使用机器和人工都可以完成卡的办理。银行所定义的开卡流程就是我们模板方法模式中的,抽象模板类用来定义流程,那么人工办卡和机器自主办卡则是两种具体实现类。

在这里插入图片描述

image

第三节

代码实现

1.编写抽象模板类

package com.yang.templatemethod;/*** @ClassName AbstractOpenCar* @Description 抽象模板类-开卡* @Author IT小白架构师之路* @Date 2021/1/5* @Version 1.0**/
public abstract class AbstractOpenCar {//开卡public void  openCar(String password){writeInfo();faceDistinguish();givePass(password);autograph();}/*** 填写个人信息*/public abstract void writeInfo();/*** 人脸识别*/public void faceDistinguish(){System.out.println("识别人脸:人脸识别系统");}//设置密码public void givePass(String password){System.out.println("设置密码:密码设置为"+password);}//签名public abstract void autograph();}

2.编写具体子类A

package com.yang.templatemethod;/*** @ClassName ArtificialOpen* @Description 人工开卡* @Author IT小白架构师之路* @Date 2021/1/5* @Version 1.0**/
public class ArtificialOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填写:提供个人信息,银行业务人员帮忙录入");}@Overridepublic void autograph() {System.out.println("签名确认:纸质签名确认");}
}

3.编写具体子类B

package com.yang.templatemethod;/*** @ClassName AutonomyOpen* @Description 机器自助开卡* @Author IT小白架构师之路* @Date 2021/1/5* @Version 1.0**/
public class AutonomyOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填写:机器手动填写个人信息");}@Overridepublic void autograph() {System.out.println("签名确认:电子签名确认");}
}

4.测试客户端

package com.yang.templatemethod;/*** @ClassName Client* @Description 客户端测试* @Author IT小白架构师之路* @Date 2021/1/5* @Version 1.0**/
public class Client {public static void main(String[] args) {AbstractOpenCar openCar = new ArtificialOpen();System.out.println("选择人工开卡-----------");openCar.openCar("123789");System.out.println("结束人工开卡-----------");openCar = new AutonomyOpen();System.out.println();System.out.println("选择自助开卡-----------");openCar.openCar("147258");System.out.println("结束自助开卡-----------");}
}

5.程序运行结果如下,程序使用银行两种开卡方式完成了模板方法模式

选择人工开卡-----------
信息填写:提供个人信息,银行业务人员帮忙录入
识别人脸:人脸识别系统
设置密码:密码设置为123789
签名确认:纸质签名确认
结束人工开卡-----------选择自助开卡-----------
信息填写:机器手动填写个人信息
识别人脸:人脸识别系统
设置密码:密码设置为147258
签名确认:电子签名确认
结束自助开卡-----------

第四节

优缺点及适用场景
优点

1.模板模式既定义了固定的流程,又支持了扩展功能,将固定的不可修改的在父类定义,子类去实现扩展的功能。

2.父类提供的公共方法,也便于代码复用

3.扩展的方法,父类不实现,交给了子类,子类可以通过继承的方式增加功能,符合了设计模式中的开闭原则。

缺点

1.如果要定义不同的实现,则需要创建新的实现类,业务增多时会增加类的数量,增加了系统的复杂性。

2.因为是通过继承实现的,如果父类增加新的流程规范(抽象方法),所有的子类都要修改源码来实现。

适用场景

1.当需要一个父类定义流程规范,但需要子类去实现的算法,父类负责不变的模块,子类负责扩展的模块时。

2.需要控制子类的扩展时(定义规范)。

3.需要将多个子类中的公共模块抽象提取出来到父类,解决代码冗余时。

4.例如我们JavaWeb开发过程中使用的servlet、filter都是使用了模板方法。

扫描二维码

关注我吧

IT小白架构师之路

image

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DoRA详解:从LoRA到权重分解的进化

DoRA​​是一种用于​​大语言模型(LLM)微调​​的技术,全称为 ​​"Weight-Decomposed Low-Rank Adaptation"​​(权重分解的低秩自适应)。它是对现有微调方法(如 ​​LoRA​​)的改…

RocksDB关键设计详解

0 说明 近日工作中使用了 RocksDB。RocksDB 的优点此处无需多说,它的一个 feature 是其有很多优化选项用于对 RocksDB 进行调优。欲熟悉这些参数,必须对其背后的原理有所了解,本文主要整理一些 RocksDB 的 wiki 文档,以备自己参考…

Kotlin -> 普通Lambda vs 挂起Lambda

1. 普通Lambda vs 挂起Lambda的本质区别 1.1 普通Lambda&#xff08;同步执行&#xff09; val lambda: (Int) -> String { it.toString() }// 编译器生成&#xff1a; class Lambda$1 : Function1<Int, String> {override fun invoke(p1: Int): String {return p1.t…

Apache Ignite 中如何配置和启用各类监控指标

这段文档是关于 Apache Ignite 中如何配置和启用各类监控指标&#xff08;Metrics&#xff09; 的详细说明。核心思想是&#xff1a;“指标收集有性能开销&#xff0c;因此默认不开启所有指标&#xff0c;需要你按需手动开启。” 下面我们来逐层拆解、通俗易懂地理解这些内容。…

uniapp x swiper/image组件mode=“aspectFit“ 图片有的闪现后黑屏

部分安卓机针对大写.JPG 有的竖图正常&#xff0c;横图/正方形不对。解决方案&#xff1a;加border-radius: 1rpx;就行<!-- 图片预览弹出框 --><fui-backdrop v-model:visible"imgPreviewVisible" :closable"true" onclick"imgPreviewVisibl…

conda安装jupter

conda自带的jupter本来在base里没有在pytorch环境中 安装jupter conda install nb_conda 此扩展程序在 Jupyter 文件浏览器中添加了一个 Conda 选项卡。选择 Conda 选项卡将显示&#xff1a; 当前存在的 Conda 环境列表当前配置的通道中可用的 Conda 包列表&#xff08;htt…

嵌入式操作系统快速入门(1):快速入门操作系统常见基础概念

快速体会操作系统常见基础概念 1 初识基本概念 1.1 操作系统 一个软件程序&#xff1b;用于解决计算机多任务执行时的资源争抢问题&#xff1b;管理计算机中的各种资源&#xff0c;确保计算机正常完成各种工作&#xff08;任务&#xff09;&#xff0c;解决多任务环境中任务的调…

网络安全-同形异义字攻击:眼见并非为实(附案例详解)

什么是同形异义字攻击&#xff1f;对人眼而言&#xff0c;一切看起来完全正常。但实际上&#xff0c;例如单词 Ηоmоgraph 并不完全等同于单词 Homograph。它们之间的差异非常细微&#xff0c;难以察觉。Ηоmоgraph 实际上包含了几个非拉丁字母。在本例中&#xff0c;我们将…

windows服务器 maven 配置环境变量,验证maven环境变量是否配置成功

前置条件&#xff1a;先确认对应版本的jdk已安装配置好&#xff0c;可使用java -version检测; 我使用的apache-maven-3.6.3是对应jdk1.8 1.找到系统变量配置窗口 以windows server2019为例&#xff0c;右键计算机属性&#xff0c; 高级系统设置–》环境变量–》系统变量2.新建M…

安装 docker compose v2版 笔记250731

安装 docker compose v2版 笔记250731 简述 v2版是插件形式 确认系统要求, 已安装 Docker Engine&#xff08;版本 20.10.5 或更高&#xff09; 安装方式可分为 apt 或 yum 安装 (能自动升级) apt install docker-compose-pluginyum install docker-compose-plugin 手动二…

PHP 5.5 Action Management with Parameters (English Version)

PHP 5.5 Action Management with Parameters (English Version) Here’s a PHP 5.5 compatible script that uses URL parameters instead of paths for all operations: <?php // Start session for persistent storage session_start();// Initialize the stored actio…

GR-3(4B) 技术报告--2025.7.23--字节跳动 Seed

0. 前言 前两天字节发布了GR-3&#xff0c;粗略的看了一下&#xff0c;在某些方面超过了SOTA pi0&#xff0c;虽然不开源&#xff0c;但是也可以来看一看。 官方项目页 1. GR-3模型 1.1 背景 在机器人研究领域&#xff0c;一直以来的目标就是打造能够帮助人类完成日常任务…

Linux网络编程:UDP 的echo server

目录 前言&#xff1a; 一、服务端的实现 1、创建socket套接字 2、绑定地址信息 3、执行启动程序 二、用户端的实现 总结&#xff1a; 前言&#xff1a; 大家好啊&#xff0c;前面我们介绍了一些在网络编程中的一些基本的概念知识。 今天我们就借着上节课提到的&#…

AI+金融,如何跨越大模型和场景鸿沟?

文&#xff5c;白 鸽编&#xff5c;王一粟当AI大模型已开始走向千行百业之时&#xff0c;备受看好的金融行业&#xff0c;却似乎陷入了落地瓶颈。打开手机银行想查下贷款额度&#xff0c;对着屏幕说了半天&#xff0c;AI客服却只回复 “请点击首页贷款按钮”&#xff1b;客户经…

深度解析:从零构建跨平台对象树管理系统(YongYong框架——QT对象树机制的现代化替代方案)

一、技术背景与核心价值 1.1 QT对象树的局限性 在Qt框架中&#xff0c;QObject通过对象树机制实现了革命性的对象管理&#xff1a; #mermaid-svg-SvqKmpFjg76R02oL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sv…

力扣46:全排列

力扣46:全排列题目思路代码题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 思路 看到所有可能首先想到的就是回溯。 回溯的结束条件也很好写&#xff0c;用数组的长度来判断即可。这道题的难点主要是如何进行判…

mac环境配置rust

rustup 是一个命令行工具&#xff0c;用于管理 Rust 编译器和相关工具链 sh 体验AI代码助手 代码解读复制代码curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh使得 Rust 的安装在当前 shell 环境中生效 如果你使用的是 bash, zsh 或其他类似的 shell&#xf…

脚手架搭建React项目

脚手架搭建项目 1. 认识脚手架工具 1.1. 前端工程的复杂化 1.1.1. 如果只是开发几个小的demo程序&#xff0c;那么永远不要考虑一些复杂的问题&#xff1a; 比如目录结构如何组织划分&#xff1b;比如如何关键文件之间的相互依赖&#xff1b;比如管理第三方模块的依赖&#xff…

Golang 调试技巧:在 Goland 中查看 Beego 控制器接收的前端字段参数

&#x1f41b; Golang 调试技巧&#xff1a;在 Goland 中查看 Beego 控制器接收的前端字段参数 在使用 Beego 开发 Web 项目时&#xff0c;我们常常会在控制器中通过 c.GetString()、c.GetInt() 等方法获取前端页面传过来的字段值。而在调试过程中&#xff0c;如何在 Goland 中…

sqli-labs:Less-2关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;数值型提示&#xff1a;参数id无需考虑闭合问题&#xff0c;相对简单 2. 手工注入步骤&#x1f3af; 我的地址栏是&#xff1a;http://l…