日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java流水線Pipeline設(shè)計(jì)模式

概述

管道模式背后的主要思想是創(chuàng)建一組操作(管道)并通過它傳遞數(shù)據(jù)。跟責(zé)任鏈和裝飾器模式相比,Pipeline的主要優(yōu)勢(shì)在于它對(duì)結(jié)果的類型具有靈活性。

管道可以處理任何類型的輸入和輸出。

不可變管道

讓我們創(chuàng)建一個(gè)不可變的管道的例子。從管道接口開始:

public interface Pipe {
    OUT process(IN input);
}

這是一個(gè)非常簡(jiǎn)單的接口,只有一個(gè)方法,它接受輸入并產(chǎn)生輸出。接口是參數(shù)化的,我們可以在其中提供任何實(shí)現(xiàn)。

現(xiàn)在,讓我們創(chuàng)建一個(gè)管道類:

public class Pipeline {

    private Collection> pipes;

    private Pipeline(Pipe pipe) {
        pipes = Collections.singletonList(pipe);
    }

    private Pipeline(Collection> pipes) {
        this.pipes = new ArrayList<>(pipes);
    }

    public static  Pipeline of(Pipe pipe) {
        return new Pipeline<>(pipe);
    }

    public  Pipeline withNextPipe(Pipe pipe) {
        final ArrayList> newPipes = new ArrayList<>(pipes);
        newPipes.add(pipe);
        return new Pipeline<>(newPipes);
    }

    public OUT process(IN input) {
        Object output = input;
        for (final Pipe pipe : pipes) {
            output = pipe.process(output);
        }
        return (OUT) output;
    }
}

因?yàn)槲覀冃枰粋€(gè)類型安全級(jí)別,并且不允許使管道失效,所以在添加新管道時(shí),將產(chǎn)生一個(gè)新的獨(dú)立管道。

簡(jiǎn)單管道

我們可以稍微簡(jiǎn)化上面的例子,并完全去掉Pipeline類:

public interface Pipe {
    OUT process(IN input);

    default  Pipe add(Pipe  pipe) {
        return input -> pipe.process(process(input));
    }
}

與以前使用管道的實(shí)現(xiàn)相比,此解決方案非常簡(jiǎn)單和靈活。

改進(jìn)

我們可以用現(xiàn)有的Function接口替代它:

public interface Function {
    //...
    R apply(T t);
    //...
}

此外,F(xiàn)unction接口包含兩個(gè)有用的方法,其中一個(gè)是andThen:

default  Function andThen(Function after) {
    Objects.requireNonNull(after);
    return (T t) -> after.apply(apply(t));
}

我們可以使用它來代替以前的add方法。此外,F(xiàn)unction接口提供了一種在管道開始時(shí)添加函數(shù)的方法:

default  Function compose(Function before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}

通過使用Function,我們可以創(chuàng)建非常靈活和易于使用的管道:

@Test
void whenCombiningThreeFunctions_andInitializingPipeline_thenResultIsCorrect() {
    Function square = s -> s * s;
    Function half = s -> s / 2;
    Function toString = Object::toString;
    Function pipeline = square.andThen(half)
        .andThen(toString);
    String result = pipeline.apply(5);
    String expected = "12";
    assertEquals(expected, result);
}

我們可以使用BiFunctions擴(kuò)展管道:

@Test
void whenCombiningFunctionAndBiFunctions_andInitializingPipeline_thenResultIsCorrect() {
    BiFunction add = Integer::sum;
    BiFunction mul = (a, b) -> a * b;
    Function toString = Object::toString;
    BiFunction pipeline = add.andThen(a -> mul.apply(a, 2))
        .andThen(toString);
    String result = pipeline.apply(1, 2);
    String expected = "6";
    assertEquals(expected, result);
}

因?yàn)閍ndThen方法采用Function,所以我們必須將mul BiFunction轉(zhuǎn)換為一個(gè)Function。

結(jié)論

Pipeline模式適用于流式遞歸傳遞輸入和處理后的輸出,對(duì)于比較簡(jiǎn)單的場(chǎng)景,使用Java函數(shù)接口是挺不錯(cuò)的選項(xiàng)。


文章名稱:Java流水線Pipeline設(shè)計(jì)模式
文章路徑:http://m.5511xx.com/article/djisihc.html