设计模式---模版模式

1. 简介

        模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式主要用来解决代码重复的问题,并且提供了一个算法的统一框架,使得子类可以在这个框架下去实现特定的功能。

特点

  • 代码复用:模板方法模式使得子类可以复用父类的代码,提高代码复用性。

  • 扩展性:通过覆盖父类的方法,子类可以很容易地扩展新的功能。

  • 控制反转:将一些步骤的控制权从子类反转到父类,父类控制流程,子类实现具体步骤。

结构

模板方法模式通常包含以下角色:

  • 抽象类(Abstract Class):定义了模板方法和算法的框架。模板方法一般是一个具体方法,它定义了算法的步骤,并调用基本方法来完成算法的部分步骤。

  • 基本方法(Primitive Method):在抽象类中定义的抽象方法或具体方法,是算法框架的一部分。抽象方法通常由子类实现,而具体方法则可以直接实现或由子类覆盖。

  • 钩子方法(Hook Method):在抽象类中定义的可供子类覆盖的方法,不做任何事情或包含默认实现。

  • 具体实现子类(Concrete Class):实现抽象类中定义的抽象方法,完成算法中可变的部分。

2. 具体案例

模拟爬⾍各类电商商品,⽣成营销推⼴海报场景

定义抽象类

package com.xiaokai.rule;/*** Author:yang* Date:2024-10-25 10:27* 模板方法模式通常包含以下几个角色:* <p>* 抽象类(Abstract Class):定义了模板方法和算法的框架。* 具体实现子类(Concrete Class):实现抽象类中定义的模板方法中的可变部分。* 钩子方法(Hook Method):在抽象类中定义,可以被子类重写,也可以不重写。* 模板方法(Template Method):定义算法的框架,调用基本方法和钩子方法。*/import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Map;/*** 基础电商推⼴服务* 1. ⽣成最优价商品海报* 2. 海报含带推⼴邀请码*/
public abstract class AbstractNetMall {protected Logger logger = LoggerFactory.getLogger(AbstractNetMall.class);String uId; // ⽤户IDString uPwd; // ⽤户密码public AbstractNetMall(String uId, String uPwd) {this.uId = uId;this.uPwd = uPwd;}/*** ⽣成商品推⼴海报** @param skuUrl 商品地址(京东、淘宝、当当)* @return 海报图⽚base64位信息*/public String generateGoodsPoster(String skuUrl) {if (!login(uId, uPwd)) return null; // 1. 验证登录Map<String, String> reptile = reptile(skuUrl); // 2. 爬⾍商品return createBase64(reptile); // 3. 组装海报}// 模拟登录protected abstract Boolean login(String uId, String uPwd);// 爬⾍提取商品信息(登录后的优惠价格)protected abstract Map<String, String> reptile(String skuUrl);// ⽣成商品海报信息protected abstract String createBase64(Map<String, String> goodsInfo);
}

当当、京东、淘宝三种行为

public class DDProduct extends AbstractNetMall {public DDProduct(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {// 模拟当当用户登录logger.debug("模拟当当用户登录, uId: {},uPwd: {}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {// 匹配Map<String, String> map = new ConcurrentHashMap<String, String>();//Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");//Matcher m9 = p9.matcher(skuUrl);//if (m9.find()) {//    map.put("name", m9.group());//}map.put("name", "当当产品天下第一好····");map.put("price", "99.00");logger.info("模拟当当商品爬⾍解析:{} | {} 元 {}", map.get("name"),map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {Base64.Encoder encoder = Base64.getEncoder();logger.info("模拟⽣成当当商品base64海报");return encoder.encode(goodsInfo.toString().getBytes()).toString();}
}public class JDProduct extends AbstractNetMall {public JDProduct(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {// 模拟淘宝用户登录logger.debug("模拟京东用户登录, uId: {},uPwd: {}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {// 匹配Map<String, String> map = new ConcurrentHashMap<String, String>();//Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");//Matcher m9 = p9.matcher(skuUrl);//if (m9.find()) {//    map.put("name", m9.group());//}map.put("name", "京东产品天下第一好····");map.put("price", "4299.00");logger.info("模拟京东商品爬⾍解析:{} | {} 元 {}", map.get("name"),map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {Base64.Encoder encoder = Base64.getEncoder();logger.info("模拟⽣成京东商品base64海报");return encoder.encode(goodsInfo.toString().getBytes()).toString();}
}public class TaoBaoProduct extends AbstractNetMall {public TaoBaoProduct(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {// 模拟淘宝用户登录logger.debug("模拟淘宝用户登录, uId: {},uPwd: {}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {// 匹配Map<String, String> map = new ConcurrentHashMap<String, String>();//Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");//Matcher m9 = p9.matcher(skuUrl);//if (m9.find()) {//    map.put("name", m9.group());//}map.put("name", "淘宝产品天下第一好····");map.put("price", "4799.00");logger.info("模拟淘宝商品爬⾍解析:{} | {} 元 {}", map.get("name"),map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {Base64.Encoder encoder = Base64.getEncoder();logger.info("模拟⽣成淘宝商品base64海报");return encoder.encode(goodsInfo.toString().getBytes()).toString();}
}

测试

public class MallApplication {public static void main(String[] args) {AbstractNetMall product = new TaoBaoProduct("xiaokai", "123456");String goodsPoster = product.generateGoodsPoster("www.taobao.com/xiaokai.caio&mfdk");System.out.println(goodsPoster);}
}模拟淘宝用户登录, uId: xiaokai,uPwd: 123456
模拟淘宝商品爬⾍解析:淘宝产品天下第一好···· | 4799.00 元 www.taobao.com/xiaokai.caio&mfdk
模拟⽣成淘宝商品base64海报
海报生成成功:[B@7907ec20

 

不积跬步,无以至千里 --- xiaokai

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

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

相关文章

react18中的函数组件底层渲染原理分析

react 中的函数组件底层渲染原理 react组件没有局部与全局之分&#xff0c;它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件&#xff0c;可以将组件挂在react上&#xff0c;这样只要引入了react&#xff0c;就可以直接使用该组件。 函数式组件的创建 …

Nestjs请求处理顺序

刚接触Nestjs的小白不知道Nestjs的请求处理顺序的话&#xff0c;这会非常使得咱们服务端不好使用。 下面是请求处理顺序图&#xff1a; 总结&#xff1a; 守卫&#xff08;Guards&#xff09; 守卫是请求处理的第一层&#xff0c;用于确定请求是否应该继续处理。它们通常用于身…

Detectron2和LSTM进行人体动作识别

1. 项目简介 本项目旨在开发一个人体动作识别系统&#xff0c;利用深度学习模型Detectron2和LSTM&#xff08;长短时记忆网络&#xff09;实现对视频中人体动作的精确识别与分类。项目背景是由于在现代智能监控、健康管理、体育分析等领域中&#xff0c;对人体动作的自动识别和…

旧电脑安装Win11提示“这台电脑当前不满足windows11系统要求”,安装中断。怎么办?

前言 最近有很多小伙伴也获取了LTSC版本的Win11镜像&#xff0c;很大一部分小伙伴安装这个系统也是比较顺利的。 有顺利安装完成的&#xff0c;肯定也有安装不顺利的。这都是很正常的事情&#xff0c;毕竟这个镜像对电脑硬件要求还是挺高的。 有一部分小伙伴在安装Windows11 …

C++对象模型:关于对象

C语言和C对比 ⭐ 关联知识点&#xff1a;C和C语言区别 &#xff08;1&#xff09;C 语言的特点 简洁与高效&#xff1a;C 语言被设计为一种系统级的编程语言&#xff0c;它提供了对硬件的直接访问能力&#xff0c;并且编译后的代码通常非常紧凑&#xff0c;运行效率高。 全…

Java SnakeYaml 反序列化漏洞原理

目录 SnakeYaml 使用 SnakeYAML 序列化与反序列化 SnakeYAML 序列化实现 SnakeYAML 反序列化实现 SnakeYaml 反序列化漏洞 基于 ScriptEngineManager 利用链 漏洞原因分析 SPI 服务提供者发现机制 命令执行 漏洞修复 SnakeYaml SnakeYAML 是一个用于 Java 语言的 YA…

面试题:JVM(一)

1. JVM概述 1.1 JVM的生命周期 说说Java虚拟机的生命周期&#xff08;阿里&#xff09; 虚拟机的启动 Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的&#xff0c;这个类是由虚拟机的具体实现指定的。 虚拟机的退出有如下…

接口测试(九)jmeter——关联(JSON提取器)

一、JSON提取器介绍 要检查的响应字段&#xff1a;样本数据源引用名称&#xff1a;可自定义设置引用方法&#xff1a;${引用变量名}匹配数字 匹配数字含义-1表示全部0随机1第一个2第二个…以此类推 缺省值&#xff1a;匹配失败时的默认值ERROR&#xff0c;可以不写 二、js…

2024年双十一有什么好物推荐?盘点2024双十一爆款好物分享

第一款&#xff1a;希亦ACE内衣洗衣机 一句话点评&#xff1a;常出口欧美等多个国家&#xff0c;被超百家专业媒体评为“洗护一体技术之王”&#xff0c;妇科细菌除菌率达99.99%&#xff0c;清洁度高达99.8%&#xff01; CEYEE希亦是清洁领域的实力大牌子了&#xff0c;也是母…

老照片如何修复变清晰?手把手教你4种模糊照片变清晰方法!

在洋溢着温情的生日聚会上&#xff0c;家人们围坐一堂&#xff0c;总会情不自禁地翻阅那些尘封已久的老照片&#xff0c;一同沉醉于往昔的温情岁月。然而&#xff0c;时光荏苒&#xff0c;许多承载着深情厚意的照片已变得泛黄、模糊&#xff0c;难以再现昔日的清晰与鲜活。但请…

vue2 a-input输入框使用正则限制为数字、英文及中文,出现吞字符和英文字符打断问题

需求是输入框限制数字、英文和中文&#xff0c;原始使用的正则是&#xff1a; replace(/[^a-zA-Z0-9\u4E00-\u9FA5]/g,)1、使用这个正则表达式使用搜狗输入法没问题&#xff0c;使用微软自带输入法后会存在输入英文会吞并当前光标前的字符&#xff0c;也有英文打断问题。 输入…

2024年【制冷与空调设备安装修理】考试及制冷与空调设备安装修理最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备安装修理考试参考答案及制冷与空调设备安装修理考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备安装修理操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备安装修理最新解…

线上遇到的问题记录(说多了都是泪)

写在前面 我觉得&#xff0c;工作中最有价值的就是及遇到的问题了&#xff0c;特别时线上这种容易让人血压升高的环境中遇到的问题&#xff0c;本文就是记录这些血压升高时刻。 如果你遇到什么真实环境的问题&#xff0c;也欢迎评论或者私信分享给我&#xff01;&#xff01;&…

Angular 保姆级别教程高阶应用 - RxJs

RxJS 13.1.1 什么是 RxJS ? RxJS 是一个用于处理异步编程的 JavaScript 库&#xff0c;目标是使编写异步和基于回调的代码更容易。 13.1.2 为什么要学习 RxJS ? 就像 Angular 深度集成 TypeScript 一样&#xff0c;Angular 也深度集成了 RxJS。 服务、表单、事件、全局状…

经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法)

经典功率谱估计的原理及MATLAB仿真&#xff08;自相关函数BT法、周期图法、bartlett法、welch法&#xff09; 文章目录 前言一、BT法二、周期图法三、Bartlett法四、welch法五、MATLAB仿真六、MATLAB详细代码总结 前言 经典功率谱估计方法包括BT法&#xff08;对自相关函数求傅…

基于Java的就业信息管理系统源码带本地搭建教程

技术框架&#xff1a;jQuery MySQL5.7 mybatis shiro Layui HTML CSs JS 运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 宝塔面板 实现了就业信息管理、就业统计、用户管理等功能。有普通用户和管理员两种角色。

开源限流组件分析(三):golang-time/rate

文章目录 本系列前言提供获取令牌的API数据结构基础方法tokensFromDurationdurationFromTokensadvance 获取令牌方法reverseN其他系列API 令人费解的CancelAt是bug吗 取消后无法唤醒其他请求 本系列 开源限流组件分析&#xff08;一&#xff09;&#xff1a;juju/ratelimit开源…

智能AI监测系统燃气安全改造方案的背景及应用价值

随着燃气行业的迅速发展和城市化进程的加快&#xff0c;燃气安全管理成为企业运营和城市管理中不可忽视的关键领域。燃气泄漏、管道破损等事故的发生不仅会造成严重的经济损失&#xff0c;还威胁到人民生命财产安全。传统的安全管理方法往往依赖人工巡检和手动监测&#xff0c;…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》&#xff0c;有朋友问光代码和文字不太真切&#xff0c;能否补充几张图片&#xff0c;今天我们演示一下&#xff1a; 这是第一帧画面&#xff1a;P1&#xff08;我们的参考帧&#xff09; 这是第二帧画面&#xff1a;P2&#xff08;需要编码的帧&…

C2W4.LAB.Word_Embedding.Part2

理论课&#xff1a;C2W4.Word Embeddings with Neural Networks 文章目录 Training the CBOW modelForward propagationInitialization of the weights and biasesTraining exampleValues of the hidden layerValues of the output layerCross-entropy loss BackpropagationGr…