点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让开发者不去考虑这些设计模式。面向对象常见的设计模式有策略模式、模板方法、观察者模式、责任链模式以及工厂模式,使用Lambda表达式(函数式编程思维)有助于避免面向对象开发中的那些固定代码。下面挑选了策略模式和职责链模式两个案例进行分析。

案例1:策略模式

当我们解决一个问题有不同的解法的时候,又不希望客户感知到这些解法的细节,这种情况下适合使用策略模式。策略模式包括三个部分:

  • 解决问题的算法(上图中的Strategy);

  • 一个或多个该类算法的具体实现(上图中的ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC)

  • 一个或多个客户使用场景(上图中的ClientContext)

面向对象思路

首先定义策略接口,表示字符串的处理算法:

然后定义具体的实现类,即不同的验证算法:

最后定义客户使用场景,代码如下图所示。Validator是为客户提供服务时使用的上下文环境,每个Valiator对象中都封装了具体的Strategy对象,在实际工作中,我们可以通过更换具体的Strategy对象来进行客户服务的升级,而且不需要让客户进行升级。

函数式编程思路

如果使用Lambda表达式考虑,你会发现ValidationStrategy就是一个函数接口(还与Predicate具有同样的函数描述),那么就不需要定义上面那些实现类了,可以直接用下面的代码替换,原因是Lambda表达式内部已经对这些类进行了一定的封装。

案例2:责任链模式

在某些场景下,需要对一个对象做一系列的工作,这些工作分别是由不同的类完成的,这时候就比较适合使用责任链模式。责任链模式的主要组成部分包括三个:

  • 管理操作序列的抽象类,在该抽象类里有会有一个对象记录当前对象的后继操作对象;

  • 一些具体的操作对象,这些操作对象会以一个链表的形式组织起来

  • 一个使用该模式的客户端组件,该组件只需要跟一个组件打交道就好,不需要跟很多个操作对象耦合在一起。

面向对象思路

首先看下我们这里定义了一个抽象类ProcessingObject,其中successor字段用于管理该对象的后继操作对象;handle接口作为对外提供服务的接口;handleWork作为实际处理对象的操作方法。

接下来可以定义两个具体的操作对象,如下面代码所示。PS:这里《Java 8实战》书中用的是replaceAll方法是不太合适的,这个点可以参考我们之前的文章——020:举几个String的API以及案例 )。

最后,你就可以在Client中将这上面两个具体的操作类对象构成一个操作序列,参见下面的代码:

函数式编程思路

如果使用函数式编程思维,那么职责链模式就直接了——y=f(x)和z=g(x)这两个方法都是要对x做处理,那么如果将这两个函数组合在一起,就会形成r=f(g(x))的情况,也就是可以使用Lambda表达式中的addThen来串联起多个处理过程。

上面是利用Java原生的Lambda表达式实现的职责链模式,我们也可以使用前面一篇文章——vavr:让你像写Scala一样写Java)中介绍过的vavr库来实现,代码如下所示:

总结

可以看出,函数式编程思维跟面向对象编程思维的思考方式是不同的,表达力更强,因此,作为开发者是时候认真学习下函数式编程思维了,作为Java开发者,我准备先从Lambda表达式开始学起。

热门内容:   

  

  • Java 程序员必须清楚的 7 个性能指标

  • 阿里巴巴的技术专家,是如何画好架构图的?

  • 史上最烂的项目:苦撑 12 年,600 多万行代码

  • 一次 Jar 包升级引发的血案 & 解决

  • 如何优雅的导出 Excel

  • JDK 13 新特性一览

  • 某小公司RESTful、共用接口、前后端分离、接口约定的实践

  • 请停止学习框架

  • IntelliJ IDEA 2019.3这回真的要飞起来了,新特性抢先看!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

用了 Lambda 之后,发现可以忘记设计模式了相关推荐

  1. 函数式编程让你忘记设计模式

    本文是一篇<Java 8实战>的阅读笔记,阅读大约需要5分钟. 有点标题党,但是这确实是我最近使用Lambda表达式的感受.设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让 ...

  2. 面向java开发者的函数式编程_函数式编程让你忘记设计模式

    本文是一篇<Java 8实战>的阅读笔记,阅读大约需要5分钟. 有点标题党,但是这确实是我最近使用Lambda表达式的感受.设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让 ...

  3. 转载:23种设计模式整理(很全)

    23 种设计模式汇集 目录 文章目录 23 种设计模式汇集 目录 设计模式引言 学习 GoF 设计模式的重要性 建筑和软件中模式之异同 设计模式之 Singleton(单态) 模式实战书籍<Ja ...

  4. 让设计模式飞一会儿|①开篇获奖感言

    从今天开始记录设计模式相关知识.在后续的文章中,我会尽量用生活中熟悉场景作为例子解释.当你真的学完每一个设计模式,并有过一些思考,会发现设计模式不再枯燥乏味,生活处处都会有它的身影. 另外,在技术领域 ...

  5. centos7系统中忘记了root管理员账号密码的解决方式

    随着计算机的使用越来越普遍,现在的用户都会有多个密码,不是这软件的密码就是那个的,QQ.邮箱.游戏,还有系统的登录密码!每一个密码都不一样!所以越来越多的密码需要去记住!也因为这样,只要其中一个长时间 ...

  6. 设计模式-UML图简单介绍

    直接上法宝: 1.类(Class)     类图分三层:     第一层显示类的名称,如果是抽象类,则就用斜体显示.     第二层是类的特性,通常就是字段和属性.     第三层是类的操作,通常是方 ...

  7. MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法

    很长时间不用了,突然想用 mysql 了,这个时候发现密码忘记了. 确保你的数据库里没有重要的数据了,我们可以把数据库重置一下. 数据库重置方法如下: 步骤一: 删掉 data 文件夹,这个文件夹的具 ...

  8. Java设计模式中的六大设计原则

    最近一直在看有关设计模式的博客和文章,发现自己对于设计模式的认识和理解还是有点浅显,于是想动手写博客巩固一下. 在开始阐述设计模式之前,首先介绍一下设计模式中的六大原则:      总原则-开闭原则 ...

  9. Spring框架中的设计模式(四)

    适配器 当我们需要在给定场景下(也就是给定接口)想要不改变自身行为而又想做到一些事情的情况下(就是我给电也就是接口了,你来做事也就是各种电器),使用适配器设计模式(这里再说一点,就相当于我们再一个规章 ...

最新文章

  1. (四)Decorator设计模式解决GET/POST请求的乱码问题(转)
  2. Vulnhub靶机渗透之 RAVEN: 1
  3. 企业信息管理- 近期功能改善(3)
  4. LeetCode算法题-K-diff Pairs in an Array(Java实现)
  5. 2018最佳GAN论文回顾(上)
  6. [bzoj3930] [CQOI2015]选数
  7. 在Window上安装Mysql
  8. 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
  9. 终于!孙宇晨和巴菲特吃上 3153 万元的晚餐,还送了一个比特币!
  10. Xslt取节点集的指定位置记录的三种方法
  11. ACM程序设计基础(1)题解
  12. 使用srvany.exe把程序安装成windows服务的方法
  13. MATLAB代码:基于分时电价条件下家庭能量管理策略研究
  14. Linux服务器使用网络代理
  15. 《pr2019》怎么加字幕
  16. 流年里写给30岁的自己
  17. Linux信号处理简析
  18. 如果Mac苹果电脑关机关不了怎么办?
  19. pytorch遇到Error loading “C:\Anaconda3\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll“
  20. 目前市面上量化交易软件、平台、框架的特点, 重点推荐VNPY底层仿真回测系统

热门文章

  1. python模块之json,pickle
  2. Applet相关知识
  3. Linux之socket套接字编程20160704
  4. 区域设置 ID (LCID) 表, 及获取方法
  5. Web前端开发最佳实践(8):还没有给CSS样式排序?其实你可以更专业一些
  6. Java设计模式之虚拟代理模式
  7. 从定制软件到通用软件的转变
  8. Matlab与随机变量和样本的数字特征
  9. OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」
  10. 学习Python,这22个包怎能不掌握?