總述
最簡(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è)模式要做的事情。

類圖

效果
正在對(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)您多多指正。