1. 概念
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有對(duì)象處理它為止。
2. 適用場(chǎng)景
1)當(dāng)程序需要使用不同方式處理不同種類請(qǐng)求, 而且請(qǐng)求類型和順序預(yù)先未知時(shí), 可以使用責(zé)任鏈模式。
2)當(dāng)必須按順序執(zhí)行多個(gè)處理者時(shí), 可以使用該模式。
3)如果所需處理者及其順序必須在運(yùn)行時(shí)進(jìn)行改變, 可以使用責(zé)任鏈模式。
3. 示例
一個(gè)消息發(fā)布場(chǎng)景,對(duì)于敏感信息的過濾,每層過濾處理不同的敏感信息。
信息內(nèi)容為:大家好:),<script>,歡迎訪問 baidu.com ,大家都是996
第一層過濾處理<> 替換為[]
第二層過濾處理996 替換為955
每層過濾處理,既能處理res信息,又能處理服務(wù)器rep的信息
如:請(qǐng)求信息經(jīng)歷1,2過濾處理,響應(yīng)信息經(jīng)歷2,1過濾處理

屏幕快照 2021-01-14 下午11.27.28.png
- Filter接口:
interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
- HTMLFilter實(shí)現(xiàn):
class HTMLFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.str = request.str.replaceAll("<", "[").replaceAll(">", "]") + "HTMLFilter()";
chain.doFilter(request, response);
response.str += "--HTMLFilter()";
}
}
- SensitiveFilter實(shí)現(xiàn):
class SensitiveFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.str = request.str.replaceAll("996", "955") + " SensitiveFilter()";
chain.doFilter(request, response);
response.str += "--SensitiveFilter()";
}
}
- 消息:
class Request {
String str;
}
class Response {
String str;
}
- FilterChain:
class FilterChain {
List<Filter> filters = new ArrayList<>();
int index = 0;
public FilterChain add(Filter f) {
filters.add(f);
return this;
}
public void doFilter(Request request, Response response) {
if(index == filters.size()) return;
Filter f = filters.get(index);
index ++;
// 遞歸思想
f.doFilter(request, response, this);
}
}
- 場(chǎng)景類:
public static void main(String[] args) {
Request request = new Request();
request.str = "大家好:),<script>,歡迎訪問 baidu.com ,大家都是996 ";
Response response = new Response();
response.str = "response";
FilterChain chain = new FilterChain();
chain.add(new HTMLFilter()).add(new SensitiveFilter());
chain.doFilter(request, response);
System.out.println(request.str);
System.out.println(response.str);
}
- 輸出結(jié)果:
大家好:),[script],歡迎訪問 baidu.com ,大家都是955 HTMLFilter() SensitiveFilter()
response--SensitiveFilter()--HTMLFilter()
4. 總結(jié)
- 優(yōu)點(diǎn)
責(zé)任鏈模式非常顯著的優(yōu)點(diǎn)是將請(qǐng)求和處理分開。請(qǐng)求者可以不用知道是誰處理的,處理者可以不用知道請(qǐng)求的全貌,兩者解耦,提高系統(tǒng)的靈活性。 - 缺點(diǎn)
責(zé)任鏈有兩個(gè)非常顯著的缺點(diǎn):一是性能問題,每個(gè)請(qǐng)求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長(zhǎng)的時(shí)候,性能是一個(gè)非常大的問題。二是調(diào)試不很方便,特別是鏈條比較長(zhǎng),環(huán)節(jié)比較多的時(shí)候,由于采用了類似遞歸的方式,調(diào)試的時(shí)候邏輯可能比較復(fù)雜。
————————————————————
坐標(biāo)帝都,白天上班族,晚上是知識(shí)的分享者
如果讀完覺得有收獲的話,歡迎點(diǎn)贊加關(guān)注