Java 8中使用Lambda表达式的策略模式

策略模式是“ 设计模式:可重用对象的元素”书中的模式之一 。 本书所述的策略模式的意图是:

定义一系列算法,封装每个算法,并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。

在本文中,我想给出一个或两个关于策略模式的示例,然后使用要在Java 8中引入的lambda表达式重写相同的示例。

策略模式:一个例子

考虑一个声明策略的接口:

interface Strategy{public void performTask();
}

考虑此策略的两种实现:

class LazyStratgey implements Strategy{@Overridepublic void performTask() {System.out.println("Perform task a day before deadline!");}}class ActiveStratgey implements Strategy{@Overridepublic void performTask() {System.out.println("Perform task now!");}}

上面的策略是幼稚的,我将其简化以帮助读者快速掌握它。 让我们看看这些策略的实际效果:

public class StartegyPatternOldWay {public static void main(String[] args) {List<Strategy> strategies = Arrays.asList(new LazyStratgey(), new ActiveStratgey());for(Strategy stg : strategies){stg.performTask();}}
}

上面的输出是:

Perform task a day before deadline!
Perform task now!

策略模式:Lambda表达式示例

让我们看一下使用Lambda表达式的相同示例。 为此,我们将保留策略接口,但是我们不必创建该接口的其他实现,而是使用lambda表达式创建该策略的不同实现。 下面的代码展示了它的实际作用:

import java.util.Arrays;
import java.util.List;public class StrategyPatternOnSteroids {public static void main(String[] args) {System.out.println("Strategy pattern on Steroids");List<Strategy> strategies = Arrays.asList(() -> {System.out.println("Perform task a day before deadline!");},() -> {System.out.println("Perform task now!");});strategies.forEach((elem) -> elem.performTask());}}

上面的输出是:

Strategy pattern on Steroids
Perform task a day before deadline!
Perform task now!

在使用lambda表达式的示例中,我们避免将类声明用于不同的策略实现,而是使用了lambda表达式。

策略模式:另一个例子

此示例的灵感来自Neal Ford在IBM Developer上的文章: Functional Design Pattern-1 。 该示例的想法完全相似,但Neal Ford使用Scala,而我使用Java进行了相同的修改,只是命名约定有所变化。

让我们看一下接口Computation,它除了声明带有两个参数的方法compute外,还声明了泛型T。

interface Computation<T> {public T compute(T n, T m);
}

我们可以有这样的计算的不同实现方式: IntSum -返回两个整数的总和IntDifference -返回两个整数和的差异IntProduct -返回两个整数的乘积。

class IntSum implements Computation<Integer> {@Overridepublic Integer compute(Integer n, Integer m) {return n + m;}}class IntProduct implements Computation<Integer> {@Overridepublic Integer compute(Integer n, Integer m) {return n * m;}
}class IntDifference implements Computation<Integer> {@Overridepublic Integer compute(Integer n, Integer m) {return n - m;}
}

现在,让我们在下面的代码中查看这些策略的实际作用:

public class AnotherStrategyPattern {public static void main(String[] args) {List<Computation> computations = Arrays.asList(new IntSum(), new IntDifference(), new IntProduct());for (Computation comp : computations) {System.out.println(comp.compute(10, 4));}}
}

上面的输出是:

14
6
40

策略模式:使用lambda表达式的另一个示例

现在,让我们看看使用Lambda表达式的相同示例。 同样,与前面的示例一样,我们不需要为策略的不同实现(即Computation接口)声明类,而是使用lambda表达式来实现相同的效果。 让我们看一个例子:

public class AnotherStrategyPatternWithLambdas {public static void main(String[] args) {List<Computation<Integer>> computations = Arrays.asList((n, m)-> { return n+m; },(n, m)-> { return n*m; },(n, m)-> { return n-m; });computations.forEach((comp) -> System.out.println(comp.compute(10, 4)));}
}

上面的输出是:

14
6
40

从以上示例中,我们可以看到使用Lambda表达式将有助于减少大量样板代码,以实现更简洁的代码。 通过实践,您可以习惯于阅读lambda表达式。

参考:来自Experiences Unlimited博客的JCG合作伙伴 Mohamed Sanaulla的Java 8中使用Lambda表达式的策略模式 。

翻译自: https://www.javacodegeeks.com/2013/07/strategy-pattern-using-lambda-expressions-in-java-8.html

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

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

相关文章

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的&#xff08;LocalStorage)的概念后&#xff0c;很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处&#xff0c;当然笔者也是其中之一&#xff0c;也难怪&#xff0c;以前用惯了cookie对于新出现的事物总是…

php mysql 正则_MySQL 正则表达式

MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配&#xff0c; MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl&#xff0c;那么操作起来就非常简单&#xff0c;因为MySQL的正…

Linux自动人机交互expect

exp_test.sh文件 #!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect {"(yes/no)" {send "yes\r";exp_continue;}"password:" {send "hadoop\r";exp_continue;}eof {exit 0;} } 执行&#xff1a;expect …

使用Spring Integration聚合异步结果

嗨&#xff0c;我遇到了一个问题&#xff0c;该问题使用Spring Integration具有非常好的解决方案。 很多时候&#xff0c;我们需要一种将消息分发到未知数量的目的地的方案。 为此&#xff0c;我们使用主题方法。 但是有时&#xff0c;我们还希望从收到消息的所有目的地接收答案…

Html5开发之链接标签nav的用法

HTML(<nav>)元素用来表示一个含有多个超链接的区域&#xff0c;这个区域的连接可以连接到其他页面&#xff0c;也可以连接到本页面内部其他部分。用法说明:并不是所有的链接都必须使用<nav>元素,它只用来将一些热门的链接放入导航栏,例如<footer>元素就常用来…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

关于Function原型对象和Object原型对象的一些疑惑

网上有一道美团外卖的面试题是这样的&#xff1a;Function.prototype.a a; Object.prototype.b b; function Person(){}; var p new Person(); console.log(p.a: p.a); // p.a: undefined console.log(p.b: p.b); // p.b: b问为什么&#xff1f;有不少同学第一眼看上去就觉…

HTML5 实现离线数据缓存

1.配置缓存文件 cache manifestMIME TYPE&#xff1a;text/cache-manifest文件名称&#xff1a;name.appcache作用&#xff1a;用于配置需要缓存的文件2.使用方法在服务器上添加MIME TYPE在apache virtual host 中添加[plain] view plaincopyAddType text/cache-manifest .appc…

pytest.7.常见套路

From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候&#xff0c;下面这些问题我们可能会经常遇到&#xff0c;这里给出官方的解决方案&#xff0c;按照套路来执行就可以了。 基础用法 把命令行参数传入到用例动态添加命令行参数根据命令行参数来忽略用例…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…

Spring Data JPA教程第一部分:配置

Spring Data JPA是一个旨在简化基于JPA的存储库的创建并减少与数据库通信所需的代码量的项目。 在我的工作和个人爱好项目中&#xff0c;我已经使用了一段时间&#xff0c;确实使事情变得更加简单和整洁。 现在是时候与您分享我的知识了。 这是我的Spring Data JPA教程的第一部…

2018-03-02

1、首先我得重新在git设置一下身份的名字和邮箱&#xff08;因为当初都忘了设置啥了&#xff0c;因为遇到坑了&#xff09;进入到需要提交的文件夹底下&#xff08;因为直接打开git Bash&#xff0c;在没有路径的情况下&#xff0c;根本没&#xff01;法&#xff01;改&#xf…

《算法通关村——再次透彻理解动态规划》

《算法通关村——透彻理解动态规划》 91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26"要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反…

html5新特性:异步上传文件

<!DOCTYPE html><html><head><meta charset"utf-8"/><title>html5文件上传</title></head><body><input type"file" name"file" id"file" /><br/><input type"s…

查看环境变量有无配置成功等命令操作

查看环境变量有无配置成功 &#xff1a;windowR cmd set&#xff08;回车&#xff09; 现在可以看到配置成功的环境变量NVM_HOME NVM_SYMLINK等环境变量 也可以单独查看某个变量有无配置成功,例如set NVM—HOME. 转载于:https://www.cnblogs.com/JavascriptAndHtml5/p/9469932…

WildFly 8.0.0.Alpha1的发布和一些历史

自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中一些问题&#…

mysql中字典值怎么添加_插入Python字典中的值,包括MySQL的键

我有以下字典&#xff1a;{ : [0, 9],3904: [playback_error, 87],3808: [playback_error, 24],3902: [qp_library_failed_to_start, 1],3903: [playback_error, 464],3805: [playback_error, 141],3807: [playback_error, 29],3806: [playback_error, 1],1309: [playback_erro…

Redis是单线程的

Redis是单线程的 学习了&#xff1a; http://blog.csdn.net/liupeng_qwert/article/details/77263187 https://www.cnblogs.com/syyong/p/6231326.html 这个膜拜一下 https://www.cnblogs.com/yuyutianxia/p/6346723.html http://blog.csdn.net/qqqqq1993qqqqq/article/detail…

POJ 1276 Cash Machine

很容易看出来是一个背包问题&#xff0c;开始把每一张钞票都跑了一遍01背包&#xff0c;直接TLE了。 其实就是多重背包模板题。 1 //#include <bits/stdc.h>2 #include <iostream>3 #include <utility>4 #include <vector>5 #include <cstring>6…

Html5结合JS实现浏览器全屏功能

项目中需要将后台浏览器的窗口全屏&#xff0c;也就是我们点击一个按钮要实现按F11全屏的效果。 在HTML5中,W3C制定了关于全屏的API&#xff0c;就可以实现全屏幕的效果&#xff0c;也可以让页面中的图片&#xff0c;视频等全屏目前只有google chrome 15 , safri5.1 ,firfox10 …