当前位置: 首页 > news >正文

研磨设计模式day14模板方法模式

目录

场景

原有逻辑

有何问题

解决方案

解决思路 

代码实现 

重写示例

模板方法的优缺点

模板方法的本质 

何时选用


场景

现在模拟一个场景,两个人要登录一个系统,一个是管理员一个是用户,这两个不同身份的登录是由后端对应的两个接口实现的,用户登录只需验证库里是否存在,管理员登录时需要验证加密后的密码是否与数据库数据一致。

原有逻辑

这里大致说一下,创建了两个实体用来描述用户和管理员传来的用户名、密码。创建两个模块来分别处理用户和管理员的登录。

有何问题

1.重复或相似代码太多2.扩展不方便(比如要添加同一个编号同时只能登录一次,那这两个登录模块都要修改)

解决方案

模板方法

定义:

解决思路 

重复代码多、扩展不方便的原因在哪?就是因为没把那些相似的代码抽取出来做成公共的功能。

我们把具体的不同的步骤实现延迟到子类去实现,这样就可以通过子类来提供不同的功能实现了。

第一和第三个步骤是必不可少,第二个是可选的(可变的)。

先定义一个父类,并在内部提供一个方法来定义整个骨架。这个方法就是模板方法,然后把父类无法确定的实现,延迟到具体的子类来实现

代码实现 

肯定有一个携带了骨架方法的父类,不用想肯定是抽象类

package day14模板方法模式;public abstract class AbstractClass {/*** 原语操作1,所谓原语操作就是抽象的操作,必须要由子类提供实现*/public abstract void doPrimitiveOperation1();/*** 原语操作2,所谓原语操作就是抽象的操作,必须要由子类提供实现*/public abstract void doPrimitiveOperation2();/*** 模板方法*/public final void templateMethod(){doPrimitiveOperation1();doPrimitiveOperation2();}
}

具体实现

package day14模板方法模式;/*** 具体实现类,实现原语操作*/
public class ConcreteClass extends AbstractClass{@Overridepublic void doPrimitiveOperation1() {}@Overridepublic void doPrimitiveOperation2() {}
}

重写示例

我们要实现登录的合并,首先需要一个共同的参数接收类

package day14模板方法模式;/*** 封装进行登录控制所需要的数据*/
public class LoginModel {/*** 登陆人员的编号,通用的,可能是用户也可能是管理员*/private String loginId;/*** 登录的密码*/private String pwd;public String getLoginId() {return loginId;}public void setLoginId(String loginId) {this.loginId = loginId;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}

接下来定义公共的登录控制算法骨架

package day14模板方法模式;/*** 登录控制的模板*/
public abstract class LoginTemplate {public final boolean login(LoginModel lm){LoginModel loginUser = this.findLoginUser(lm.getLoginId());if (loginUser != null){String pwd = this.encryptPwd(lm.getPwd());lm.setPwd(pwd);// 判断是否匹配的上return this.match(lm,loginUser);}return false;}public boolean match(LoginModel lm, LoginModel loginUser){if (lm.getLoginId().equals(loginUser.getLoginId()) && lm.getPwd().equals(loginUser.getPwd())){return true;}return false;}/*** 根据登陆编号来查找和获取存储中相应的数据* @param loginId* @return*/public abstract LoginModel findLoginUser(String loginId);/*** 对密码数据进行加密*/public String encryptPwd(String pwd){return pwd;}
}

实现用户登录控制的逻辑处理

package day14模板方法模式;/*** 普通用户登录控制的逻辑处理*/
public class NormalLogin extends LoginTemplate {@Overridepublic LoginModel findLoginUser(String loginId) {// 这里省略具体的处理,仅作示意,返回一个有默认数据的对象LoginModel loginModel = new LoginModel();loginModel.setLoginId(loginId);loginModel.setPwd("testPwd");return loginModel;}
}

管理员登录控制的逻辑处理

package day14模板方法模式;/*** 工作人员登录控制的逻辑处理*/
public class WorkerLogin extends LoginTemplate {@Overridepublic LoginModel findLoginUser(String loginId) {// 这里省略具体的处理,仅作示意,返回一个有默认数据的对象LoginModel loginModel = new LoginModel();loginModel.setLoginId(loginId);loginModel.setPwd("testPwd");return loginModel;}@Overridepublic String encryptPwd(String pwd) {System.out.println("使用MD5加密");return super.encryptPwd(pwd);}
}

Client

package day14模板方法模式;public class Client {public static void main(String[] args) {// 准备登陆人的信息LoginModel loginModel = new LoginModel();loginModel.setLoginId("admin");loginModel.setPwd("workerpwd");// 准备用来判断的对象WorkerLogin workerLogin = new WorkerLogin();NormalLogin normalLogin = new NormalLogin();// 进行登录测试boolean login = workerLogin.login(loginModel);System.out.println("管理员可以登录= " + login);boolean login1 = normalLogin.login(loginModel);System.out.println("用户可以登录=" + login1);}
}

模板方法的优缺点

模板方法的本质 

固定算法骨架

很好的体现了开闭原则和里氏替换原则

何时选用

相关文章:

研磨设计模式day14模板方法模式

目录 场景 原有逻辑 有何问题 解决方案 解决思路 代码实现 重写示例 模板方法的优缺点 模板方法的本质 何时选用 场景 现在模拟一个场景,两个人要登录一个系统,一个是管理员一个是用户,这两个不同身份的登录是由后端对应的两个接…...

7 集群基本测试

1. 上传小文件到集群 在hadoop路径下执行命令创建一个文件夹用于存放即将上传的文件: [atguiguhadoop102 ~]$ hadoop fs -mkdir /input上传: [atguiguhadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/work.txt /input2.上传大文件 [atguiguhadoop1…...

chrono学习(一)

我想用chrono进行沙土的仿真,首先学习demo_GPU_ballCosim.cpp,这个例子仿真了一些沙土的沉降过程。 首先,运行编辑完成的文件demo_GPU_ballCosim: (base) eowyneowyn-MS-7D20:~/build_chrono/bin$ ./demo_GPU_ballCosim 运行完得…...

后端面试话术集锦第 十 篇:springMVC面试话术

这是后端面试集锦第十篇博文——springMVC面试话术❗❗❗ 1. 介绍一下springMVC springmvc是一个视图层框架,通过MVC模型让我们很方便的接收和处理请求和响应。 我给你说说他里边的几个核心组件吧: 它的核心控制器是DispatcherServlet,他的作用是接收用户请求,然后给用户…...

基于Django 框架搭建的机器学习在线平台源代码+数据库,实现KNN、ID3、C4.5、SVM、朴素贝叶斯、BP神经网络等算法及流程管理

结果展示(Kmeans): 完整代码下载地址:基于Django 框架搭建的机器学习在线平台源代码数据库 python机器学习之 K-邻近算法 简单的理解:[ 采用测量不同特征值之间的距离方法进行分类 ] 优点 :精度高、对异常…...

大数据组件-Flume集群环境搭建

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...

想系列服务迁移专有云效实操

想系列服务迁移专有云效实操 1注册应用 查看jenkins脚本是否需要修改代码编译路径 gemdale_jenkins/maven3-service/k8s-image/maven3-service-deploy.sh Jenkins上的打包路径 service_tgt_path s e r v i c e w s / t a r g e t / service_ws/target/ servicew​s/target/ser…...

2020 牛客多校第三场 C Operation Love (叉积判断顺逆时针)

2020 牛客多校第三场 (叉积判断顺逆时针) Operation Love 大意: 给出一个手型 , 每个手型都有 20 个点 ,手型有可能旋转后给出 , 但不会放大和缩小 . 手型点集有可能顺时针给出也可能逆时针给出 , 判断给出的是左手还…...

基于OFDM的水下图像传输通信系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 function [rx_img] func_TR(tx_img, num_path, pathdelays, pathgains, snr) rng(default); …...

Docsify + Gitalk详细配置过程讲解

💖 作者简介:大家好,我是Zeeland,开源建设者与全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客:Zeeland📚 Github主页: Undertone0809 (Zeeland)&…...

React中的setState的执行机制

文章目录 前言setState是什么?更新类型批量更新后言 前言 在 React 中,setState 是用于更新组件状态的方法。它是一个异步操作 值得注意的是,由于 setState 是异步的,所以在调用 setState 后立即访问 this.state 可能得到的还是旧的状态值。…...

2023最新任务悬赏平台源码uniapp+Thinkphp新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机

新款悬赏任务地推拉新充场游戏试玩源码众人帮威客兼职任务帮任务发布分销机制 后端是:thinkphpFastAdmin 前端是:uniapp 1.优化首页推荐店铺模块如有则会显示此模块没有则隐藏。 2修复首页公告,更改首页公告逻辑。(后台添加有公…...

微服务事务管理(Dubbo)

Seata 是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 一、示例架构说明 可在此查看本示例完整代码地址&#x…...

Springboot整合ClickHouse

一、快速开始 1、添加依赖 <dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.1-patch</version> </dependency> <dependency><groupId>com.alibaba&…...

【材料整理】-- Python、Matlab中常用调试代码,持续更新!

文章目录 Python、Matlab中常用调试代码&#xff0c;持续更新&#xff01;一、Python常用调试代码&#xff1a;二、Matlab常用调试代码&#xff1a; Python、Matlab中常用调试代码&#xff0c;持续更新&#xff01; 一、Python常用调试代码&#xff1a; 1、保存.mat文件 from…...

什么是同源策略(same-origin policy)?它对AJAX有什么影响?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 同源策略&#xff08;Same-Origin Policy&#xff09;与 AJAX 影响⭐ 同源策略的限制⭐ AJAX 请求受同源策略影响⭐ 跨域资源共享&#xff08;CORS&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?

开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…...

CSC2121A

半桥架构的栅极驱动电路CSC2121A CSC2121系列是一款高性价比的半桥架构的栅极驱动专用电路&#xff0c;用于大功率MOS管、IGBT管栅极驱动。IC内部集成了逻辑信号处理电路、死区时间控制电路、欠压保护电路、电平位移电路、脉冲滤波电路及输出驱动电路&#xff0c;专用于无刷电…...

高级进程编程-系统调用-创建守护进程

系统调用 API 参考&#xff1a;用时现查 如何在Linux下的进行多进程编程&#xff08;初步&#xff09; - 知乎 (zhihu.com)。 Linux 下系统调用的三种方法_海风林影的博客-CSDN博客。 linux系统调用(持续更新....)_tiramisu_L的博客-CSDN博客。 通过 glibc 提供的库函数、…...

Redis之发布订阅

一、Redis的发布订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者&#xff08;subscriber&#xff09;&#xff1a;每当有其他客户端向被订阅的频…...

XXMI启动器:一站式二次元游戏模组管理终极指南,轻松管理热门游戏模组

XXMI启动器&#xff1a;一站式二次元游戏模组管理终极指南&#xff0c;轻松管理热门游戏模组 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher XXMI启动器是一款功能强大的开源游戏…...

Taotoken API Key管理与访问控制功能在团队大赛中的协作应用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API Key管理与访问控制功能在团队大赛中的协作应用 1. 场景概述&#xff1a;团队协作中的API资源管理需求 当团队共同参…...

Vulhub 中的 Cacti-CVE-2025-24367

0x00 前言先看结果吧&#xff0c;复现是成功了&#xff0c;但是没拿到shell&#xff0c;和我想的不一样。漏洞原理&#xff1a;Cacti是一款利用RRDTool数据存储和图形化功能的完整网络图形化解决方案。在Cacti 1.2.28及以前版本中存在一个命令注入漏洞&#xff0c;该漏洞允许已…...

3大功能让Mac永不停歇:自动鼠标移动器的终极指南

3大功能让Mac永不停歇&#xff1a;自动鼠标移动器的终极指南 【免费下载链接】automatic-mouse-mover a minimalistic go library/app to keep your mac active and alive 项目地址: https://gitcode.com/gh_mirrors/au/automatic-mouse-mover 你是否曾在重要视频会议中…...

FRED案例:矩形微透镜阵列

介绍小透镜阵列可应用在很多方面&#xff0c;其中包含光束均匀化。本文演示了一个用于在探测器上创建均匀的非相干照度的成像微透镜阵列的设计。输入光束具有高斯轮廓&#xff0c;半宽度等于微透镜阵列大小&#xff0c;并且显示了其功率轮廓被微透镜阵列消除掉。系统输出简单示…...

Python机器学习管道:Scikit-learn Pipeline深度解析

Python机器学习管道&#xff1a;Scikit-learn Pipeline深度解析 引言 在Python开发中&#xff0c;机器学习管道是构建和部署机器学习模型的关键。作为一名从Rust转向Python的后端开发者&#xff0c;我深刻体会到Scikit-learn Pipeline在简化机器学习工作流方面的优势。Pipeline…...

3分钟完成智能图像分层:Layerdivider一键PSD生成终极指南

3分钟完成智能图像分层&#xff1a;Layerdivider一键PSD生成终极指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对一张精美的插画&#x…...

终极碧蓝航线自动化脚本:Alas智能辅助工具完整指南

终极碧蓝航线自动化脚本&#xff1a;Alas智能辅助工具完整指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript AzurLaneAuto…...

AD导出Gerber文件时,单位选英寸格式选2:5?一文讲透这些‘祖传’设置背后的原因

为什么PCB工程师至今仍在使用英寸和2:5格式导出Gerber文件&#xff1f; 在PCB设计领域&#xff0c;有一个看似奇怪却普遍存在的现象&#xff1a;即使全球绝大多数国家采用公制单位&#xff0c;工程师们在导出Gerber文件时却坚持使用英制单位&#xff08;英寸&#xff09;&#…...

终极指南:5分钟掌握XUnity自动翻译器,轻松实现Unity游戏汉化

终极指南&#xff1a;5分钟掌握XUnity自动翻译器&#xff0c;轻松实现Unity游戏汉化 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的日语游戏剧情而烦恼吗&#xff1f;面对满屏英文的游戏界…...