攔截過(guò)濾器模式

總述

最簡(jiǎn)化的應(yīng)用場(chǎng)景就是,發(fā)送方要發(fā)送信息給接收方。但是呢,在信息傳輸?shù)倪^(guò)程中要經(jīng)過(guò)層層篩選和過(guò)濾,這個(gè)就是攔截過(guò)濾器模式的基本意思了。
就好比你要喝水,但是擔(dān)心水里不干凈,于是安了個(gè)凈水器,那么從自來(lái)水龍頭到你的水杯之間,就經(jīng)過(guò)了層層過(guò)濾和篩選。
就好像你要乘飛機(jī),從進(jìn)入航站樓門口到進(jìn)入機(jī)艙之間還要經(jīng)過(guò)層層的安檢。
我就舉這倆例子來(lái)說(shuō)明攔截過(guò)濾器模式的基本思想,我覺(jué)得已經(jīng)很通俗易懂了,你再不明白我就沒(méi)辦法了。

過(guò)濾器管理者有啥用呢?

它是負(fù)責(zé)維護(hù)過(guò)濾器鏈條的維修工、包工頭、負(fù)責(zé)人,它負(fù)責(zé)管理這個(gè)過(guò)濾器鏈。你要面對(duì)的是不同類型的功能模塊,而不是多個(gè)同類型的東西,因此要把很多同類型的東西進(jìn)行統(tǒng)一管理,于是就有了這個(gè)過(guò)濾器管理者的存在。

怎么理解這個(gè)客戶端呢?

它是一個(gè)隔離層,或者是一個(gè)對(duì)接的接口。它一邊和用戶對(duì)接,一邊和過(guò)濾器管理者對(duì)接。就好像是常見(jiàn)的圖形化操作界面的意思。這是軟件設(shè)計(jì)中層次化的提現(xiàn),可以讓系統(tǒng)結(jié)構(gòu)清晰,功能明確,是非常好的做法。

什么是應(yīng)用?

我就覺(jué)得這個(gè)名字起的不好,容易讓人理解偏了,我覺(jué)得把它叫做消息接收方最恰當(dāng),你就按照這個(gè)名字去理解才能比較好地理解到。

圖示

我覺(jué)得單單靠類圖難以直觀表達(dá)這個(gè)模式要做的事情。

圖示.png

類圖

類圖.png

效果

正在對(duì)水進(jìn)行沙土過(guò)濾
正在對(duì)水進(jìn)行細(xì)菌過(guò)濾
正在對(duì)水進(jìn)行蟲卵過(guò)濾
最終還是喝到了水

Process finished with exit code 0

調(diào)用

package com.company;

public class Main {

    public static void main(String[] args) {
    // write your code here
        FilterManager manager = new FilterManager();
        manager.addFilter(new Filter1());
        manager.addFilter(new Filter2());
        manager.addFilter(new Filter3());
        manager.setReceiver(new Receiver());

        OperationClient client = new OperationClient();
        client.setManager(manager);
        client.inputMessage("水");
    }
}

過(guò)濾器接口

package com.company;

public interface Filter {
    /**
     * 執(zhí)行過(guò)濾的方法,是所有過(guò)濾器必須要實(shí)現(xiàn)的方法。
     * @param inputString
     */
    public void executeFilt(String inputString);
}

第1個(gè)濾鏡

package com.company;

public class Filter1 implements Filter {
    @Override
    public void executeFilt(String inputString) {
        System.out.println("正在對(duì)" + inputString + "進(jìn)行沙土過(guò)濾");
    }
}

第2個(gè)濾鏡

package com.company;

public class Filter2 implements Filter {
    @Override
    public void executeFilt(String inputString) {
        System.out.println("正在對(duì)" + inputString + "進(jìn)行細(xì)菌過(guò)濾");
    }
}

第3個(gè)過(guò)濾器

package com.company;

public class Filter3 implements Filter {
    @Override
    public void executeFilt(String inputString) {
        System.out.println("正在對(duì)" + inputString + "進(jìn)行蟲卵過(guò)濾");
    }
}

過(guò)濾器管理者

package com.company;

public class FilterManager {
    private FilterChain chain;

    public FilterManager() {
        this.chain = new FilterChain();
    }

    public void addFilter(Filter aFilter) {
        this.chain.addFilter(aFilter);
    }

    public void setReceiver(Receiver receiver) {
        this.chain.setReceiver(receiver);
    }

    public void proccessMessage(String inputString) {
        this.chain.execute(inputString);
    }
}

圖形化操作層次

package com.company;

public class OperationClient {
    private FilterManager manager;

    public void setManager(FilterManager manager) {
        this.manager = manager;
    }

    public void inputMessage(String message) {
        this.manager.proccessMessage(message);
    }
}

過(guò)濾器鏈

package com.company;

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
    private List<Filter> filters;
    private Receiver receiver;

    public FilterChain() {
        this.filters = new ArrayList<>();
    }

    public void setReceiver(Receiver receiver) {
        this.receiver = receiver;
    }

    public void execute(String inputString) {
        for (Filter iterator:this.filters) {
            iterator.executeFilt(inputString);
        }
        if (this.receiver != null) {
            this.receiver.getMessage(inputString);
        }
    }

    public void addFilter(Filter aFilter) {
        this.filters.add(aFilter);
    }
}

最終接收端

package com.company;

public class Receiver {
    /**
     * 接收者最終接收到了經(jīng)過(guò)層層過(guò)濾的消息。
     * @param inputString
     */
    public void getMessage(String inputString) {
        System.out.println("最終還是喝到了" + inputString);
    }
}

多謝捧場(chǎng)

如果您覺(jué)得我的文章有價(jià)值,那么賞臉打賞一個(gè),鄙人感激不盡。不過(guò),不打賞看看也是好的,如果有不對(duì)的地方,還請(qǐng)您多多指正。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容