<noscript id="fyakh"><blockquote id="fyakh"><rt id="fyakh"></rt></blockquote></noscript>
    <strong id="fyakh"><tr id="fyakh"><wbr id="fyakh"></wbr></tr></strong>
    <strong id="fyakh"><samp id="fyakh"><source id="fyakh"></source></samp></strong>
    <li id="fyakh"></li>

        Java企業教程系列

        使用Java8的Lambda實現策略模式

           策略Strategy模式是GoF設計模式中的一種。定義了一組算法,彼此封裝,客戶端調用能夠獨立地使用它們。在這里我們使用Java 8的Lambda表達式實現策略模式。

        我們首先看看傳統Java實現策略模式案例,假設一個接口為策略:

        interface Strategy{

        ? public void performTask();

        }

        這個策略有兩個實現:

        class LazyStratgey implements Strategy{

        ? @Override

        ? public void performTask() {

        ??? System.out.println("Perform task a day before deadline!");

        ? }

        }

         

        class ActiveStratgey implements Strategy{

        ? @Override

        ? public 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!

        以上是傳統Java實現的,下面我們使用Java 8以后提供Lambda表達式實現策略模式:

        使用Lmabda我們就不需要為策略接口創建不同的實現子類了,使用lambda表達式替代。

        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!


        另外一個案例 :

        有一個計算接口:

        interface Computation<T> {

        ? public T compute(T n, T m);

        }

        計算接口下有三個子類,IntSum – 返回兩個整數的總和,, IntDifference – 返回兩個整數的差值,IntProduct – 返回兩個整數的乘積。傳統Java需要實現三個子類如下:

        class IntSum implements Computation<Integer> {

        ? @Override

        ? public Integer compute(Integer n, Integer m) {

        ??? return n + m;

        ? }

        }

         

        class IntProduct implements Computation<Integer> {

        ? @Override

        ? public Integer compute(Integer n, Integer m) {

        ??? return n * m;

        ? }

        }

         

        class IntDifference implements Computation<Integer> {

        ? @Override

        ? public Integer compute(Integer n, Integer m) {

        ??? return n - m;

        ? }

        }

        調用客戶端代碼需要對這三個子類進行new創建:

        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));

        ??? }

        ? }

        }

        而使用Lambda表達式則不必實現創建三個子類。直接使用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)));

        ? }

        }

         

        Closure Lambda和Monad

        Java 8教程

        函數編程

         

         

        一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片