策略模式定义封装在通常称为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

设计模式的Java 8 Lambda表达式–策略设计模式相关推荐

  1. 设计模式的Java 8 Lambda表达式-策略设计模式

    策略模式定义封装在通常称为Context的驱动程序类中的一系列算法,并使这些算法可互换. 它使算法易于互换,并提供了在特定时间选择适当算法的机制. 算法(策略)在运行时由客户端或上下文选择. 在与客户 ...

  2. 设计模式的Java 8 Lambda表达式–命令设计模式

    在本博客中,我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 . 命令模式的目的是将请求封装为对象,从而为具有不同请求,队列或日志请求的客户端参数化,并支持相应的操作. 命 ...

  3. 设计模式的Java 8 Lambda表达式–装饰器设计模式

    Decorator模式(也称为Wrapper )允许将行为静态或动态地添加到单个对象,而不会影响同一类中其他对象的行为. 可以将其视为子类的替代方法. 我们知道子类在编译时会增加行为,并且更改会影响原 ...

  4. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  5. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  6. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  7. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  8. Java 8 Lambda表达式-接口实现

    Java 8 Lambda表达式在只有一个方法的接口实现代码编写中,可以起到简化作用: (argument list) -> body 具体看Runnable接口的例子 public class ...

  9. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

最新文章

  1. 用于部分迁移学习的加权对抗网络 | CVPR 2018论文解读
  2. Python面试题之装饰器漫谈
  3. linux 自带 mysql,linux下安装mysql
  4. LeetCode——最小栈
  5. PHP两文件嵌套循环引用,php的循环与引用的一个坑,php循环引用_PHP教程
  6. 关于 intptr_t
  7. c语言指针数组反序存放,用指针实现逆序存放数组元素
  8. springcloud微服务学习笔记(五十一):Config配置总控中心搭建
  9. jQuery菜鸟学习实例
  10. 华为鸿蒙harmonyos-面向全场,华为鸿蒙 OS 下月发布?别做梦了……
  11. 这个七夕,送你一份程序员教科书级别的告白指南
  12. Java输出九九乘法表(99乘法)
  13. 2021-3-29 【PTA】【天梯赛】【25分】
  14. 工具中的文件夹选项不见了!
  15. 可乐瓶游戏c语言,大班活动玩可乐瓶教案
  16. 「每周译Go」Windows 系统的Gopher们久等了!!
  17. react项目创建步骤
  18. Qt实现小型的超市收银系统
  19. js-jquery-001-条形码概述
  20. javaweb项目-医者天下 (Spring+SpringMVC+MyBatis)

热门文章

  1. selenium以及chromdrive安装
  2. 树层级处理上万条数据优化!
  3. 《朝花夕拾》金句摘抄(一)
  4. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
  5. Hibernate基本概念 (2)
  6. html session 登录页面跳转页面跳转页面,session失效后跳转到登陆页面
  7. mybatis=<>的写法
  8. python安装运行时提示不是内部或外部命令怎么办_如何解决cmd运行python提示不是内部命令...
  9. 分类器评估参数——准确度和精度的区别(足球荔枝)
  10. jQuery中的几个案例:隔行变色、复选框全选和全不选