设计模式的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/336612.shtml

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

相关文章

调用打印机_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...

以前一直以为打印很简单&#xff0c;不就是编辑好文件按个“打印”就行了&#xff1f;但其实打印过程可以复杂到你分分钟“怀疑人生”。你以为的打印过程可能是这样的 ↓。我们看到的打印过程然而&#xff0c;真正的打印过程是这样的 ↓。实际上的打印过程打印机打印一页文件或…

kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理

kite 使用 go从我担任软件工程师的第一天起&#xff0c;我总是听到很多方面的相同要求&#xff1a; “ 我们希望所有内容都可配置&#xff0c;我们希望在运行时更改所有内容&#xff0c;我们希望有一个可视化工具来应用所有这些逻辑&#xff0c;以便非开发人员使用和配置我们的…

使用react实现select_使用 Hooks 优化 React 组件

奇技指南本文内容主要是我之前分享的文字版&#xff0c;若想看重点的话可以看之前的Slide: https://ppt.baomitu.com/d/75fc979a本文作者奇舞团前端开发工程师李喆明。需求描述由于作者所在的业务是资讯内容类业务&#xff0c;因而在业务中会经常碰到如下场景&#xff1a;有一个…

cacti不能实时刷新流量图_介绍一种编码帧内刷新算法

0.引言本文主要介绍一种帧内刷新算法&#xff0c;解决I帧太大带来的延迟问题&#xff0c;可以在调优时&#xff0c;值得借鉴。帧内刷新技术避免 I 帧尖峰带来的带宽压力&#xff0c;可以有效地降低视频通信中的缓冲区延迟。帧内刷新算法是一种视频错误恢复的方法&#xff0c;通…

按钮自动居中布局_CSS布局技巧

css实现左右布局和居中布局显示是前端进行页面设计的基础&#xff0c;也是全面了解并学习css一个很好的切入点&#xff0c;因为其中会涉及到对许多css基础点的认知。实现css入门&#xff0c;理解左右布局的实现方式是必经之路&#xff0c;同时也能使我们在项目中涉及前端编码的…

jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...

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

多方法接口回调_啊?Java反射遇到接口

本文适合有点Java反射基础的同学&#xff0c;在Java反射调用方法时遇到接口参数是一件很蛋疼的事情。在反射调用方法时需要传参数&#xff0c;像传递基本数据类型进去用就完事&#xff0c;传个对象进去怎么整都没关系&#xff0c;因为你在外部有对象的引用&#xff0c;但 如果需…

0与1世界的初级编程篇之C语言

C语言是一门面向过程的计算机编程语言&#xff0c;与C、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速&#xff0c;工作量小…

QT 手动创建信号函数 与 槽函数

自定义信号槽必须要有Q_OBJCT 自己通过关键字signals创建信号函数,只声明信号函数即可&#xff0c;系统会自动定义它。 利用 public slots: 声明一个槽函数&#xff0c;槽函数不会自动生成&#xff0c;并且去定义它。

九九乘法表代码口述_利用随机函数实现座次表的随机排座

昨天听完讲座&#xff0c;晚上忍不住写了份学后感&#xff0c;今天有老师在文章下留言问如何实现随机排座&#xff0c;上午在快速理赔中心处理交通事故&#xff0c;处理完后将车开去4S店维修&#xff0c;回来后给娃做完中饭就开始写代码实现这个功能&#xff0c;因为有C功底&am…

jep使用_JEP 277“增强弃用”非常好。 但这是一个更好的选择

jep使用维护API很难。 我们正在维护非常复杂的jOOQ API。 但是就语义版本而言&#xff0c;我们遵循相对宽松的规则 。 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时&#xff0c;我只能对他们的工作表示敬意。 显然&#xff0c;我们都希望最终移除Vector &a…

古巴比伦乘法_古巴平台中的通用过滤器–类固醇上的excel过滤器

古巴比伦乘法正如我上次承诺的那样&#xff0c;我计划浏览该平台的某些功能&#xff0c;这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面&#xff0c;过滤&#xff0c;安全性到一些高级功能&#xff08;如Web Portal&#xff0c;可扩展性&#xff0c;…

excel运行没反应_Excel数据很少文件却很大,问题出在哪里呢?两种方法轻松解决...

经常和Excel打交道的小伙伴可能会有这样的困惑&#xff0c;一个Excel工作簿中的数据明明很少&#xff0c;文件所占的空间却很大。打开这种Excel工作簿后&#xff0c;电脑CPU占用率瞬间飙升&#xff0c;甚至遇见工作簿没有响应的情况出现。遇见这样的工作簿让人窝火&#xff0c;…

java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍

java lambda::与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用…

如何在java中实现小数点自增_java编个计算器怎么在加入小数点

展开全部我做的可以运行&#xff0c;你看看吧&#xff01;import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField…

在Java中使用FileChannel和ByteBuffer对文件进行读写

过去&#xff0c;我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO&#xff0c;在本Java NIO教程中&#xff0c;我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法&#xff0c;它提供了比InputStream…

tp5防止sql注入mysql_PHP+Mysql防止SQL注入的方法(life)

这篇文章介绍的内容是关于PHPMysql防止SQL注入的方法&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下我的官方群点击此处。方法一&#xff1a;mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符&#xff0…

neo4j 关系属性_Neo4j:特定关系与一般关系+属性

neo4j 关系属性为了在Neo4j查询中获得最佳的遍历速度&#xff0c;我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件之间的“ RSVP”关系建模。 一个人可以对某个事件表示“…

2008r2配置 iis mysql php_Windows 2008 R2服务器配置文档iis+php+mysql

关闭防火墙关闭防火墙打开桌面远程连接修复系统依赖文件IIS配置添加角色创建一个网站验证iis是否成功删除默认创建的网站添加网站PHP配置安装解压&#xff0c;改名创建一个php.ini&#xff0c;php.ini由php.ini-production改名得到如果输入php -v后出现如下报错解决方法如下(安…

接口入口在什么地方_弱电工程施工图审查要点?有哪些地方需要审核?审核要求是什么?...

前言&#xff1a;弱电工程施工图审核标准是什么呢&#xff1f;需要审核哪些方面呢&#xff1f;有没有可以参考的地方&#xff1f;今天就分享一套弱电系统施工图审核技术要求&#xff0c;可以参考正文&#xff1a;1.设计文件设计文件是否完整(包括设计说明、平面图、系统图(单体…