设计模式的Java 8 Lambda表达式–策略设计模式

策略模式定义封装在通常称为Context的驱动程序类中的一系列算法,并使这些算法可互换。 它使算法易于互换,并提供了在特定时间选择适当算法的机制。

算法(策略)在运行时由客户端或上下文选择。 在与客户端交互期间,Context类处理所有数据。

战略模式的主要参与者如下:

战略

  • 策略–指定所有算法的接口。 该接口用于调用由ConcreteStrategy定义的算法。
  • 上下文–维护对策略对象的引用。
  • ConcreteStrategy –根据策略接口的算法的实际实现

现在,让我们看一下策略模式的具体示例,并看一下如何使用lambda表达式对其进行转换。 假设我们有不同类型的税率来计算所得税。 根据是提前还是延迟缴税,分别有回扣或罚款。 我们可以将此功能与不同方法封装在同一类中,但是如果将来需要进行其他一些税收计算,则需要对该类进行修改。 这不是一种有效的方法。 更改类的实现应该是最后的选择。

让我们通过使用策略模式来采取最佳方法。 我们将使用基本方法为“税收策略”建立界面:

public interface TaxStrategy {public double calculateTax(double income);
}

现在让我们定义正常所得税的具体策略。

public class PersonalTaxStrategy implements TaxStrategy {public PersonalTaxStrategy() { }@Overridepublic double calculateTax(double income) {System.out.println("PersonalTax");double tax = income * 0.3;return tax;}
}

PersonalTaxStrategy类符合TaxStrategy接口。 同样,让我们​​为延迟付款定义一种具体的策略,该策略会产生罚款。

public class PersonalTaxPenaltyStrategy implements TaxStrategy {public PersonalTaxPenaltyStrategy() { }@Overridepublic double calculateTax(double income) {System.out.println("PersonalTaxWithPenalty");double tax = income * 0.4;return tax;}
}

接下来让我们定义一种预付款的具体策略,以实现退税。

public class PersonalTaxRebateStrategy implements TaxStrategy {public PersonalTaxRebateStrategy() { }@Overridepublic double calculateTax(double income) {System.out.println("PersonalTaxWithRebate");double tax = income * 0.2;return tax;}
}

现在,让我们结合定义的所有类和接口,以利用策略模式的强大功能。 让main方法充当不同策略的上下文。 仅查看所有这些类的一个示例相互作用:

import java.util.Arrays;
import java.util.List;public class TaxStrategyMain {public static void main(String [] args) {//Create a List of Tax strategies for different scenariosList<TaxStrategy> taxStrategyList =Arrays.asList(new PersonalTaxStrategy(),new PersonalTaxPenaltyStrategy(),new PersonalTaxRebateStrategy());//Calculate Tax for different scenarios with corresponding strategiesfor (TaxStrategy taxStrategy : taxStrategyList) {System.out.println(taxStrategy.calculateTax(30000.0));}}
}

运行此命令可获得以下输出:

PersonalTax
9000.0
PersonalTaxWithPenalty
12000.0
PersonalTaxWithRebate
6000.0

它清楚地说明了如何通过使用适当的具体策略类别来计算不同的税率。 我试图将所有具体策略(算法)组合在一个列表中,然后通过遍历该列表来访问它们。

到目前为止,我们所看到的仅仅是标准策略模式,而且已经存在了很长时间。 在这些时候,函数式编程是新的流行语,可以在Java中对lambda表达式的支持下思考,事情可以做得不同吗? 实际上,由于策略接口就像一个功能接口,因此我们可以使用Java中的lambda表达式进行哈希处理。 让我们看看代码的样子:

import java.util.Arrays;
import java.util.List;public class TaxStrategyMainWithLambda {public static void main(String [] args) {//Create a List of Tax strategies for different scenarios with inline logic using LambdaList<TaxStrategy> taxStrategyList =Arrays.asList((income) -> { System.out.println("PersonalTax"); return 0.30 * income; },(income) -> { System.out.println("PersonalTaxWithPenalty"); return 0.40 * income; },(income) -> { System.out.println("PersonalTaxWithRebate"); return 0.20 * income; });//Calculate Tax for different scenarios with corresponding strategiestaxStrategyList.forEach((strategy) -> System.out.println(strategy.calculateTax(30000.0)));}
}

运行此命令可获得类似的输出:

PersonalTax
9000.0
PersonalTaxWithPenalty
12000.0
PersonalTaxWithRebate
6000.0

我们可以看到,使用lambda表达式会使具体策略的其他类变得多余。 您不需要其他课程; 只需使用lambda表达式指定其他行为。

  • 可以从我的github存储库访问所有代码片段

翻译自: https://www.javacodegeeks.com/2016/01/java-8-lambda-expression-design-patterns-strategy-design-pattern.html

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

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

相关文章

sata修改为ahci后系统无法启动_固态重装系统

固态硬盘凭借其高速的读写速度&#xff0c;已经成为现如今很多用户电脑的标配。对于刚刚为电脑换上固态硬盘的用户来说&#xff0c;固态硬盘里并没有装有系统&#xff0c;因此首要任务就是进行重装系统win10。那么&#xff0c;固态硬盘如何装系统呢?为固态硬盘重装系统&#x…

10年老电脑如何提速_中国电信宣布将对宽带免费提速,最高500Mbps

电信宽带用户们有福了&#xff01;中国电信宣布&#xff0c;自11月9日到12月31日&#xff0c;启动“智慧生活好物节&#xff0c;宽带免费加速度”活动&#xff0c;对接入速率200Mbps以下的电信光纤宽带家庭用户&#xff0c;免费在线提速到200Mbps。接入速率大于等于200Mbps但小…

gromacs 安装_带你入门带你飞 gromacs材料计算模拟系列

为了帮助大家了解掌握gromacs材料计算模拟计算&#xff0c;材料人于9月28日举办该主题研讨会。视频回看已经上线。培训内容1 GROMACS入门操作基础1.1掌握GROMACS所用的Linux命令1.2 GROMACS的linux版编译安装1.3 GROMACS各种输入输出文件讲解1.4 GROMACS力场讲解2 GROMACS建模2…

计算机c盘能分区吗,电脑C盘怎么分区

电脑C盘怎么分区C盘是指电脑硬盘主分区之一&#xff0c;一般用于储存或安装系统使用。针对安装在本地硬盘的单操作系统来说&#xff0c;是默认的本地系统启动硬盘。下面是jy135小编收集整理的电脑C盘怎么分区&#xff0c;欢迎阅读。以Windows 7为例&#xff0c;鼠标右键选择计算…

PCB-电解电容的封装

点击到完成即可 转载于:https://www.cnblogs.com/liangjinjie/p/6719605.html

java虚拟机_Oracle独家:Java虚拟机学习指南

大家好&#xff0c;我是极客时间《深入拆解 Java 虚拟机》作者、Oracle Labs 高级研究员郑雨迪。有幸借这个专题的机会&#xff0c;能和大家分享为何 Java 工程师要学 Java 虚拟机&#xff1f;如何掌握 Java 虚拟机&#xff1f;工欲善其事&#xff0c;必先利其器“为什么学 Jav…

windows聚焦壁纸不更新_壁纸推荐说 | 爱上你的壁纸,每天更新的免费壁纸软件dynamic theme...

搜罗东西 好物尝鲜图&#xff5c;源网络文&#xff5c;百里丶“ 看官们好&#xff01;这里是每期都在的百里&#xff0c;每期的好物推荐缘由都会出现在这里。喜欢的小伙伴可以点个关注呦!看过前文的小伙伴都知道百里是一个爱好尝鲜的&#xff0c;那对于自己每天一定会接触到的…

jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友搏斗字节码

欢迎来到jOOQ Tuesdays系列。 在本系列中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及其他各种相关主题的人员。 我们很高兴在第七版中与Rafae…

软件工程个人作业03—找水王

实验要求&#xff1a; 结对开发伙伴&#xff1a; 姓名&#xff1a;陶雨洁 博客地址链接&#xff1a;http://www.cnblogs.com/Amyheartxy/p/6736268.html 一、设计思想 其实在课堂上&#xff0c;老师已经点出了一点思路&#xff0c;已经很接近于答案&#xff0c;具体思路如下&am…

wps分享为什么要登入_【知识分享】柴油为什么要加氢处理?

柴油是石油经过常压分馏后得到的产物。如果直接由石油炼制得到&#xff0c;柴油中的硫、氮、氧含量较高&#xff0c;烯烃的含量也比较高。产品中烯烃的含量高则容易出现变色现象&#xff0c;而且还会影响机动车的使用寿命&#xff0c;对大气污染程度也相对大些。为了克服上面这…

mybatisplus 结果_SpringBoot + MyBatisPlus 快速入门

Hello,大家好&#xff01;前面与大家分享了一次如何搭建Java项目脚手架&#xff0c;并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目&#xff0c;也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

w7鼠标计算机无法识别,win7电脑遇见usb鼠标无法标识的详细处理步骤

部分win7电脑用户遇见usb鼠标无法标识的情况&#xff0c;要怎么处理呢?下面教程就为你们带来了win7电脑遇见usb鼠标无法标识的详细处理步骤。1、首先&#xff0c;如果你的鼠标出现没有反应的情况&#xff0c;你就把鼠标拔下来&#xff0c;然后插到电脑的另一个USB插口上面&…

小米air2se耳机只有一边有声音怎么办_别光盯着AirPods,这些无线蓝牙耳机,其实也很好用...

几年前TWS耳机市场还是AirPods的天下&#xff0c;但如今TWS已经不再是苹果专属&#xff0c;很多手机厂商也入局TWS耳机行列里来&#xff0c;推出了很多高性价比的TWS耳机&#xff0c;今天小编就给大家推荐4款TWS耳机&#xff0c;当然如果有更好的推荐也欢迎大家补充。1、小米 A…

webpack打包生成的map文件_一站式搞明白webpack中的代码分割

上次分析到通过devtool的配置项来设置source map&#xff0c;在线上环境可以通过设置成cheap-module-source-map来生成单独的map文件&#xff0c;但是map文件在线上环境会不会每次都加载呢&#xff1f;如果加载的话&#xff0c;会不会造成带宽和请求的浪费呢&#xff1f;笔者也…

计算机PMA,PMA通信协议分析及仿真工具

PMA通信协议分析及仿真软件是专为计算机通信开发人员打造的一款模拟分析工具&#xff0c;现在不少设备在进行开发的时候都需要对通信协议进行分析了&#xff0c;使用这款工具可以有效地对设备进行模拟、查看通信状况以及进行模拟仿真处理等操作&#xff0c;软件提供了多种运行模…

红帽JBoss企业应用平台7.0 ALPHA发布了!

红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集&#xff0c;消息传递&#xff0c;分布式缓存和其他技术集成在一起。 现在可以下载最新…

chrome只能装在c盘吗_电脑硬盘使用与文件整理入门——逃离C盘?

在Windows 10伴随着SSD固态硬盘大范围铺开的背景下&#xff0c;曾经广泛传播的硬盘使用模式&#xff08;C盘装系统&#xff0c;D盘装软件&#xff0c;E、F盘放各种文件&#xff09;是否还有实践意义&#xff1f;我们该基于什么样的理念来养成一些良好习惯&#xff0c;从而安全又…

机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...

导读&#xff1a;5月8日至10日&#xff0c;第六届中国机器人峰会暨智能经济人才峰会即将盛大启幕&#xff0c;海内外重磅嘉宾、业界精英将汇聚一堂&#xff0c;带来一场超高水准的人工智能盛宴。会议举办地浙江宁波余姚&#xff0c;历史悠久、文化底蕴深厚&#xff0c;通过文化…

计算机ip地址未修复连接不了无线网络,本地连接没有有效的ip配置,教您修复本地连接没有有效的ip配置...

我们在平时使用电脑工作中&#xff0c;时常会遇到网络连接不上&#xff0c;进行网络诊断后&#xff0c;会提示“本地连接没有有效的IP配置”的问题&#xff0c;那么如何解决这个问题呢&#xff1f;下面小编就来给大家快速修复本地连接没有有效的ip配置的问题。经常使用电脑上网…

同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?

布莱恩特&#xff1a;.NET Core开发精选文章目录,持续更新&#xff0c;欢迎投稿&#xff01;​zhuanlan.zhihu.com前言1.什么是async/await&#xff1f; await和async是.NET Framework4.5框架、C#5.0语法里面出现的技术&#xff0c;目的是用于简化异步编程模型。2.async和await…