責(zé)任鏈模式

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

最后編輯于
?著作權(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ù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

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

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