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表達式。
翻譯自: https://www.javacodegeeks.com/2013/07/strategy-pattern-using-lambda-expressions-in-java-8.html
總結
以上是生活随笔為你收集整理的Java 8中使用Lambda表达式的策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 夏普2348n设置ip(夏普2348N)
- 下一篇: Java EE EJB拦截器教程和示例