【设计模式】实战篇

目录标题

  • 【实战一】模板方法模式
    • 抽象类
    • 子类

【实战一】模板方法模式

待优化的代码 -  模板方法模式

抽象类

定义一个抽象类:FarmWorkNodeRecord:表示其记录是用来操作计划的节点对象的。

public abstract class FarmWorkNodeRecordService  {// 模拟Mapperprivate String plantPlanRuleDifferenceThresholdService = "plantPlanRuleDifferenceThresholdService";private String plantPlanRuleInfoService = "plantPlanRuleInfoService";private String plantPlanInfoService = "plantPlanInfoService";/*** 模板方法*/final void insertFarmWorkNodeRecordVo(String type){// 1. 插入当前记录insertFarmWorkNodeRecord();// 2. 插入土地insertBatchLand();// 3. 更新种植计划规则updatePlantPlanRule();// 4. 更新规则差值表calculatePlantPlanRuleDifferenceThreshold(type);// 5. 计划节点操作状态更新updateIfAccomplishNodeFarming(type);}/*** 插入当前记录*/abstract void insertFarmWorkNodeRecord();/*** 插入土地*/abstract void insertBatchLand();/*** 仅延迟种植计划当前的节点规则*/void updateSelf(){System.out.println("3. "+ plantPlanRuleInfoService +"\t仅延迟种植计划当前的节点规则");}/*** 延迟种植计划当前节点以及后序的节点规则*/void updateSelfAndChild(){System.out.println("3. "+ plantPlanInfoService +"\t延迟种植计划当前节点以及后序的节点规则");}/***  更新规则差值表*/void calculatePlantPlanRuleDifferenceThreshold(String nodeType){System.out.println("4. " + plantPlanRuleDifferenceThresholdService +"\t【" + nodeType + "】更新规则差值表");}/*** 计划节点操作状态更新: 父、 子*/void updateIfAccomplishNodeFarming(String nodeType){System.out.println("5. " + plantPlanRuleInfoService +"\t【" + nodeType  + "】更新节点操作状态");}/*** 是否种植计划只延迟当前的结点规则* @return true更新当前; false 延迟当前以及*/boolean isOnlyUpdateSelf() {return true;}/*** 更新种植计划规则** <p>updateSelfAndChild* <ul>*    <li> 延迟种植计划当前节点以及后序的节点规则:*</ul>* <p>updateSelf* <ul>*    <li> 仅延迟种植计划当前的节点规则*</ul>**/final void updatePlantPlanRule(){if (isOnlyUpdateSelf()){updateSelf();}else {updateSelfAndChild();}}}

下面解释一下,对这个抽象类类进行优化的思想:
「首先,先对业务操作高度抽象化,转化为模板方法」
我们先把 上图 「待优化的代码 - 模板方法模式」框住的代码高度抽象化,变为步骤3
image.png
「接下来,对模板方法的步骤进行分析」

  • 重复的代码,放到超类里面,统一进行管理
    • 普通方法
    • final 方法

image.png

  • 不重复的代码,交给子类进行重写
    • 抽象方法

image.png
「最后,通过钩子函数来决定到底调用哪个方法」
通过钩子函数:isOnlyUpdateSelf 来决定 步骤3updatePlantPlanRule 实际调用:updateSelf 或者 updateSelfAndChild
image.png

子类

子类BootStage实现:

public class FarmWorkNodeRecordBootStageServiceImpl extends FarmWorkNodeRecordService{// 模拟Mapperprivate String farmWorkRecordBootStageMapper = "farmWorkRecordBootStageMapper";private String farmWorkRecordBootStageLandMapper = "farmWorkRecordBootStageLandMapper";@Overridevoid insertFarmWorkNodeRecord() {System.out.println("1. "+ farmWorkRecordBootStageMapper +"\t插入当前记录");}@Overridevoid insertBatchLand() {System.out.println("2. "+ farmWorkRecordBootStageLandMapper +"\t插入土地");}}

子类SprayStage实现:

public class FarmWorkNodeRecordSprayStageServiceImpl extends FarmWorkNodeRecordService{// 模拟代替Mapperprivate String farmWorkSprayStageMapper = "farmWorkSprayStageMapper";private String farmWorkRecordSprayStageLandMapper = "farmWorkRecordSprayStageLandMapper";@Overridevoid insertFarmWorkNodeRecord() {System.out.println("1. "+ farmWorkSprayStageMapper +"\t插入当前记录");}@Overridevoid insertBatchLand() {System.out.println("2. "+ farmWorkRecordSprayStageLandMapper +"\t插入土地");}/*** 重写钩子函数* @return*/@Overrideboolean isOnlyUpdateSelf() {return false;}
}

此时,对于模板方法也就完毕了。测试看看:

1. farmWorkRecordBootStageMapper	插入当前记录
2. farmWorkRecordBootStageLandMapper	插入土地
3. plantPlanRuleInfoService	仅延迟种植计划当前的节点规则
4. plantPlanRuleDifferenceThresholdService	【BootStage】更新规则差值表
5. plantPlanRuleInfoService	【BootStage】更新节点操作状态1. farmWorkSprayStageMapper	插入当前记录
2. farmWorkRecordSprayStageLandMapper	插入土地
3. plantPlanInfoService	延迟种植计划当前节点以及后序的节点规则
4. plantPlanRuleDifferenceThresholdService	【SprayStage】更新规则差值表
5. plantPlanRuleInfoService	【SprayStage】更新节点操作状态

❓但是,此时我们还没有解决我们在前面框住的代码。我们还需要解决如下的场景:
image.png
我是觉得简易工厂模式比较符合。
目前还没有想好说服自己到底用哪一个。
咕咕咕。另外我还剩下两个模式没有看完。忙得很啊。
在这里插入图片描述
估计会先把书看完,之后再来把这个遗留问题解决。

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

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

相关文章

Arduino中的map函数

一、案例 val analogRead(dyPin); //读取模拟口的模拟量数值 dyValuemap(val,0,1023,0,500);//这个函数是将电位器调节的模拟量的值按比例转换成对应的电压量 问题&#xff0c;为什么不是0~499呢&#xff1f; 其实也行↓ 当map(val, 0, 1023, 0, 500)被调用时&#xff0…

关于异业联盟模式做成小程序的可行性分析

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级应用&#xff0c;受到了越来越多企业和用户的青睐。而异业联盟模式则是一种有效的商业合作方式&#xff0c;能够实现资源共享、优势互补和共同发展。将异业联盟模式做成小程序&#xff0c;不仅可以提高用户体验&#…

[论文笔记] Dual-Channel Span for Aspect Sentiment Triplet Extraction

一种利用句法依赖和词性相关性信息来过滤噪声&#xff08;无关跨度&#xff09;的基于span方法。 会议EMNLP 2023作者Pan Li, Ping Li, Kai Zhang团队Southwest Petroleum University论文地址https://aclanthology.org/2023.emnlp-main.17/代码地址https://github.com/bert-ply…

海外盲盒APP系统开发,探寻盲盒的海外机遇

目前&#xff0c;盲盒在我国受到了消费者的欢迎。在各类影视动漫的火热下&#xff0c;热衷于娱乐消费的年轻人成为了盲盒的主要消费人群。 在国外&#xff0c;盲盒也同样深受海外消费者的喜爱。近几年&#xff0c;盲盒在海外的销售量急速上升&#xff0c;创下了新高。 随着盲…

Windows 7 一键恢复 - 联想拯救系统

Windows 7 一键恢复 - 联想拯救系统 1. 联想拯救系统1.1. OEM 分区1.2. 一键恢复 References 1. 联想拯救系统 1.1. OEM 分区 计算机 -> 管理 -> 存储 -> 磁盘管理 1.2. 一键恢复 重新启动电脑 F11 -> 从初始备份恢复 References [1] Yongqiang Cheng, https…

2024年国产最好的家用投影仪!当贝极米坚果稳居口碑销量前三

国产投影仪在2024年已经极为成熟&#xff0c;也具有极为丰富的挑选余地。但如何选择合适的品牌和型号&#xff0c;一直是很多人的困惑。不过国产家用投影仪哪个最好&#xff0c;性价比最高都其实非常容易分辨。这次也来盘点下2024年最新排行榜&#xff0c;给大家无需复杂攻略即…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

Linux中的常用基础操作

ls 列出当前目录下的子目录和文件 ls -a 列出当前目录下的所有内容&#xff08;包括以.开头的隐藏文件&#xff09; ls [目录名] 列出指定目录下的子目录和文件 ls -l 或 ll 以列表的形式列出当前目录下子目录和文件的详细信息 pwd 显示当前所在目录的路径 ctrll 清屏 cd…

报表控件Stimulsoft Reports、Dashboards 和 Forms 新版v2024.2发布!

我们很高兴地宣布发布用于创建报告、仪表板和表单的最新版本的 Stimulsoft 产品 - 2024.2&#xff01;在此更新中&#xff0c;您将找到适用于 Python 应用程序和服务的产品、新的仪表板元素、我们的组件与 .NET 8.0 的兼容性、仪表板交互性的增强功能等等。 Stimulsoft Ultima…

vulhub中Apache Shiro 1.2.4反序列化漏洞复现(CVE-2016-4437)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中&#xff0c;加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的…

PHP 服务实现监控可观测性最佳实践

前言 本次实践主要是介绍 PHP 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 主机环境&#xff1a;CentOS 7.8PHP&#xff1a;7.4.33MySQL&#xff1a;5.7 接入方案 准备工作 安装 DataKit # 需要把token 改成观测云空间的实际token值&#xff08;可在观测…

Telegram账号显示已被封禁?这篇解封申诉教程可以帮到你

一打开Telegram突然出现【该手机号码已被封禁】的信息&#xff1f; 无论是Telegram手机端和电脑PC端都自动掉线并退出了&#xff1f; 遇到这些情况不要慌&#xff01;以下教你四个向Telegram官方申诉的方法&#xff01;希望可以帮助你顺利拯救你的Telegram账号。 &#xff0…

源聚达科技:抖音开网店选品渠道有哪些

在数字浪潮中&#xff0c;抖音不仅是短视频的集散地&#xff0c;也成为了众多创业者眼中的电商圣地。想要在抖音开设一家成功的网店&#xff0c;选品环节至关重要。那么&#xff0c;如何在琳琅满目的商品中找到适合自己店铺的宝贝呢?以下几种选品渠道或许能为你指明方向。 直接…

如何在Linux系统使用宝塔面板搭建Inis博客并发布至公网【内网穿透】

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

基于 C++ STL 的图书管理系统213行

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 一、实践项目名称 二、实践目的 三、实践要求 四、实践内容 五、代码框架参考 六、代码效果展示 七、完整代码主函数展示 一、实践项目名称 基于 C STL 的图书管理系统 二、实践目的 通过设计和实现一个基于…

Linux之缓冲区与C库IO函数简单模拟

缓冲区 首先, 我们对缓冲区最基本的理解, 是一块内存, 用户提供的缓冲区就是用户缓冲区, C标准库提供的就是C标准库提供的缓冲区, 操作系统提供的就是操作系统缓冲区, 它们都是一块内存. 为什么要有缓冲区? 先举个生活中的例子, 我们寄快递的时候往往是去驿站寄快递, 而不是…

教大家几种解决msvcr120.dll文件丢失的问题以及解决办法

当这个msvcr120.dll文件丢失或损坏时&#xff0c;依赖它的程序可能无法启动或正常运行&#xff0c;这可能影响电脑的使用效率。如果用户遇到因缺少msvcr120.dll而导致的程序错误&#xff0c;安装或修复这个msvcr120.dll文件是一种维护措施&#xff0c;可以帮助恢复软件的正常功…

中等职业学校大数据课程建设方案

大数据产业是以数据及数据所蕴含的信息价值为核心生产要素&#xff0c;通过数据技术、数据产品、数据服务等形式&#xff0c;使数据与信息价值在各行业经济活动中得到充分释放的赋能型产业。 大数据产业定义一般分为核心业态、关联业态、衍生业态三大业态。 一、专…

Spring Security之认证过滤器

前言 上回我们探讨了关于Spring Security&#xff0c;着实复杂。这次咱们聊的认证过滤器就先聊聊认证功能。涉及到多方协同的功能&#xff0c;咱分开聊。也给小伙伴喘口气&#xff0c;嘻嘻。此外也是因为只有登录认证了&#xff0c;才有后续的更多功能集成的可能。 认证过滤器…

巧用 20个 Linux 命令贴士与技巧,让你生产力瞬间翻倍?

在本文中&#xff0c;我将向您演示一些专业的Linux命令技巧&#xff0c;这些技巧将使您节省大量时间&#xff0c;在某些情况下还可以避免很多麻烦&#xff0c;而且它也将帮助您提高工作效率。 并不是说这些只是针对初学者的 Linux 技巧。即使有经验的Linux用户也有可能没有发现…