【设计模式】责任链模式,让程序员摆脱乱糟糟的零散的代码

news/2024/5/14 11:12:57/文章来源:https://www.cnblogs.com/zhbeier/p/16803714.html

🤵‍♂️ 个人主页:奇想派

👨‍💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️!

🗺️学海无涯苦作舟,🛤️编程之路无悔路!

📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注,不胜感激!

🚀 更多内容,点击链接扫码关注公众号👉编程达人

责任链模式&函数式编程在java中的实践

在java中借用javascript大规模使用的functional programming

基础思想-函数式编程

什么是函数式编程?
  • 函数式编程是一种编程的范式(A programming paradigm.)。就像面向过程面向对象。总的来说,Function is King,函数为王。

  • 函数式编程是一种思维模式。该使用什么样的方式去解决你的问题?就像你不想去破解一个代码块完整性(内聚),那么你可以加入一个切面,去影响该代码块的执行结果。

为什么要函数式编程?
  • Object-oriented in javascript gets tricky. 在复杂的处理过程中,java的面向对象也许不能很好处理繁琐,复杂得业务逻辑,对象往往纠缠不清。
  • Safer, easier to debug/maintain. 可维护性更高。
如何去函数式编程?
  • Do everything in function:以函数方式思考。对于一个业务逻辑,如果以函数的角度思考,那么可以抽离出若干的函数进行处理,而非乱糟糟的零散的代码

  • 规定好Input/Output。一个函数规定好IO,就能去更好地承接上下游业务,更好地区分模块。

  • 下面就是标准的函数式编程

var name = "alan";
function greet(){  name = "jade";  return "Hi,I'm "+name;
}
function sayMyName(name){  return "Hi,I'm "+name;
}
greet();
sayMyName(name);
=> "Hi,I'm alan "

责任链模式在jdk8中的实践

在有了上面的函数式编程的思想,接下来结合jdk的Function语法糖,可以产生很强的实战性代码

下面以一个 赚钱---> 买西红柿 ----> 洗西红柿 ----> 切西红柿----> 煮西红柿 的例子。

完整的例子

public class PipleLineTest {static class Money{}static class RawTomato{}static class CleanTomato{}static class TomatoSlice{}static class CookedTomato{}final static Supplier<Money> makeMoney = ()->{System.out.println("我要努力赚钱买西红柿!!");Money money = new Money();System.out.println("赚到钱了,返回一堆钱");return money;};final static Function<Money,RawTomato> buyRawTomato = (money)-> {System.out.println("去市场买西红柿!");final RawTomato rawTomato = new RawTomato();System.out.println("买好西红柿了,得到了一个有泥的西红柿,需要洗一下,回家!");return rawTomato;};final static Function<RawTomato,CleanTomato> cleanTomato = (rawTomato)-> {System.out.println("回到家,准备洗西红柿!");final CleanTomato cleanTomato1 = new CleanTomato();System.out.println("洗好西红柿了!返回一个干净的西红柿");return cleanTomato1;};final static Function<CleanTomato,TomatoSlice> cutTomato = (cleanTomato)-> {System.out.println("准备切西红柿!");final TomatoSlice tomatoSlice = new TomatoSlice();System.out.println("切好西红柿了!返回西红柿切片");return tomatoSlice;};final static Function<TomatoSlice,CookedTomato> cookTomato = (tomatoSlice)-> {System.out.println("准备烹饪西红柿!");final CookedTomato cookedTomato = new CookedTomato();System.out.println("西红柿了煮好了!返回了一个煮好的西红柿,开饭!");return cookedTomato;};public static void main(String[] args){final Money money = makeMoney.get();buyRawTomato.andThen(cleanTomato).andThen(cutTomato).andThen(cookTomato).apply(money);}
}

由上面可以看出,【煮西红柿】这个完整的步骤每一个步骤的输入输出都非常明确,维护的时候,就可以清晰看到哪个步骤需要调整/修改了。并且强制你去思考输入输出,会规范你的代码,提高可读性。

总结

使用函数式编程,可以很好地模块化每个步骤的代码。而责任链可以很好地承接我们的业务逻辑,而JDK8的函数式语法糖就赋予这2个思想很好实践的能力。

🚀博主个人博客网站:奇想派

🎨文章首发平台:微信公众号【编程达人】编程达人

🔥原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论💬点赞👍收藏📂三连走起!谢谢大家!

拜托了

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

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

相关文章

socket编程—UDP套接字

socket编程—UDP套接字一、UDP套接字socket函数的参数socket&#xff08;&#xff09;函数返回值1、服务端创建套接字绑定端口提供服务2、客户端创建套接字一、UDP套接字 IP是标识互联网当中的唯一一台主机 端口号是标识一台主机内的唯一一个进程 两者相加就是标识互联网当中唯…

245 - 转换流

1、转换流&#xff1a; InputStreamReader , OutputStreamWriter 【1】转换流&#xff1a;作用&#xff1a;将字节流和字符流进行转换。 【2】转换流 属于 字节流还是字符流&#xff1f; 属于字符流 InputStreamReader &#xff1a;字节输入流 —> 字符的输入流 Outp…

Odoo | 页面视图的跳转逻辑

目录前言页面跳转的流程及逻辑点击后进入 call\_botton方法&#xff0c;验证先检查method方法名。内置方法&#xff0c;检查方法名&#xff0c;如果是私有方法&#xff0c;提示错误。方法名合法之后进入call\_kw方法&#xff0c;检查api的值。获取一些系统的上下文&#xff0c;…

【3D游戏建模全流程教学】使用3dmax制作教堂场景

本文分享了使用3dmax制作教堂场景的流程&#xff0c;并解释V-Ray的渲染过程。 01场景制作 在网站中收集许多的参考图像&#xff0c;然后使用平面、立方体和圆柱体等基本形状来制作场景。再制作基础照明以了解场景的构图和总体外观&#xff0c;从视口制作预览动画。 下一步是创…

计算机体系机构的发展

40年代&#xff0c;当时的 计算机是采用什么样的方式来工作的&#xff0c;比如是不是采用存储程序的方式还是采用程序控制的方式&#xff0c;最典型的是第一台计算机他是采用硬件互联的方式实现的&#xff0c;第一台采用存储程序的计算机时ENIAC 60年代&#xff0c;人们更关注…

Vue中的数据代理

什么是数据代理 数据代理&#xff1a;通过一个对象代理对另一个对象中属性的操作(读/写)。 想要更加深刻的理解什么是数据代理&#xff0c;就必须先了解JS中对象的一个方法&#xff1a;Object.defineProperty()&#xff0c;数据代理主要使用Object.defineProperty()的第三个参数…

构建性能测试知识体系

转载:https://mp.weixin.qq.com/s?__biz=MzkwNTI2NjAxMA==&mid=2247484048&idx=1&sn=6700370d90c5c5ceae2729297f6e8ef4&chksm=c0fb14a5f78c9db3ae1bd31e50a1253a95d2a97ae1888ee22025d0c5bed4bd86a63599dd36cb&scene=178&cur_album_id=233153993986…

《对线面试官》| 高频 Redis 面试题(上)

目录前言百分之99面试官都爱问的 Redis 面试题1、谈下你对 Redis 的了解2、Redis适用于哪些场景&#xff1f;不适用于哪些场景&#xff1f;3、Redis 支持的数据类型有哪些&#xff1f;4、既然Redis是单线程架构&#xff0c;但为什么这么快&#xff1f;5、什么是缓存穿透&#x…

星巴克急了,瑞幸就稳了?

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文|螳螂观察 作者|易不二 新消费下行&#xff0c;但咖啡赛道却异常拥堵。 Manner正在不亦乐乎玩联名、Tims中国进入上市倒计时、茶颜悦色挤进了咖啡市场、幸运咖开始反攻一线...... 跨界的玩家们就更是从四面八方…

【Shell篇三】Shell数组

文章目录一、Shell数组的定义二、Shell数组的常用操作三、Shell数组的增删改查四、Shell数组的遍历一、Shell数组的定义 Bash Shell只支持一维数组定义时使用圆括号&#xff0c;元素用空格分开初始化数组时不需要定义数组的大小 eg: array(A 1 B "C" 3) array2()也…

voron 2.4 皮带张紧度调节

相关视频 【浅谈一下Voron2.4打印机,让入门者有个清晰的定位和了解】https://www.bilibili.com/video/BV1KL4y1N76C?share_source=copy_web&vd_source=4df36574d866076e5078105782af91de Z轴AB轴

(01)ORB-SLAM2源码无死角解析-(64) BA优化(g2o)→闭环线程:Optimizer::OptimizeSim3→Sim3变换优化

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下: (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/123092196 文末正…

白名单里的蓝桥杯“计算思维”竞赛到底考啥,有啥用处?

可能很多人都已经知道了&#xff0c;教育部公布的《2022-2025学年面向中小学生的全国性竞赛活动名单》正式宣告了&#xff0c;蓝桥杯全国软件和信息技术专业人才大赛成为了白名单比赛中的一员了。 而根据蓝桥杯的竞赛说明&#xff0c;2023年4月15~16日&#xff0c;以及4月22~2…

微信对接百度实现文字识别OCR

微信对接百度实现文字识别OCR 前置基础条件&#xff1a; ①注册测试账号 ②开通自己的测试公众号 ③完成与微信互发消息 ④完成自定义菜单栏 详细步骤&#xff1a;https://blog.csdn.net/weixin_45565886/category_12059118.html 1 获取到百度文字识别API ①注册百度智能云账…

Tomcat修改端口、添加域名访问

一、修改改端口 1、修改默认访问端口8080,改为80 # vim /usr/local/tomcat/conf/server.xml (路径是自己的安装目录)<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=&…

spring 原理解析

spring 要解决的问题 1.spring 是如何创建一个bean对象的 bean对象其实就是一个实例 无非通过一些当时来丰富这个对象的内容 典型的就是aop和依赖注入 spring在通过构造方法创建一个实例对象后 就进入一个aop的阶段&#xff0c;这个阶段来实现属性 参数的依赖注入&#xf…

自然资源部第三地理信息制图院与Bigemap强强联手,共同推动多元化新GIS应用

近日&#xff0c;成都比格图数据处理有限公司(以下简称&#xff1a;Bigemap)与自然资源部第三地理信息制图院正式达成战略合作&#xff0c;未来双方将共同推动"基于矢量、影像、地形、实景三维等GIS数据在行业上的深化应用及国产化替代"合作。 自然资源部第三地理信…

小程序技术可助力智慧医疗企业破茧突围?

智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来爆发期。智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来…

基于java的果蔬在线销售系统/农产品销售系统

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

8-3 通过Grafana展示Prometheus的Node和Pod数据

文章目录前言Node数据node-exporter指标数据Prometheus采集node-exporter数据Grafana展示node-exporter数据导入模板Pod数据cadvisor指标数据Prometheus采集cadvisor数据Grafana展示cadvisor数据导入模板修改名字前言 在上一章节 8-2 通过Node-Exporter和Cadvisor收集指标数据…