自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java設(shè)計模式:責任鏈

開發(fā) 后端
責任鏈模式(Chain of Responsibility)的目標是使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有一個對象處理它為止。

責任鏈模式(Chain of Responsibility)的目標是使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有一個對象處理它為止。

在處理用戶的請求時可能要根據(jù)不同的情況對請求添加不同的處理邏輯,在這時候就可以利用責任鏈進行設(shè)計。當需要添加一個處理邏輯時可以很方便的添加一個處理的節(jié)點。

現(xiàn)在我們的需求是處理用戶的請求,將用戶提交的字符串信息進行層層處理,同時在處理完成之后返回結(jié)果時,也要對返回的字符串進行層層處理,而處理返回的情況時其處理的順序和先前是正好相反的順序。

首先建立用戶的請求和接收對象Request和Response:

  1. package com.lcq.filter;  
  2.  
  3. public class Request {  
  4.     String requestStr;  
  5.  
  6.     public String getRequestStr() {  
  7.         return requestStr;  
  8.     }  
  9.  
  10.     public void setRequestStr(String requestStr) {  
  11.         this.requestStr = requestStr;  
  12.     }  
  13.  
  14. }  
  1. package com.lcq.filter;  
  2.  
  3. public class Response {  
  4.     String responseStr;  
  5.  
  6.     public String getResponseStr() {  
  7.         return responseStr;  
  8.     }  
  9.  
  10.     public void setResponseStr(String responseStr) {  
  11.         this.responseStr = responseStr;  
  12.     }  
  13.  
  14. }  

我們將處理用戶信息的邏輯抽象成為一個個的過濾器,進一步抽象出過濾器接口Filter:

  1. package com.lcq.filter;  
  2.  
  3. public interface Filter {  
  4.     public void doFilter(Request request, Response response,FilterChain chain);  
  5.  
  6. }  

注意在Filte接口中doFilter方法參數(shù)中有FilterChain的一個變量,我們再建立FilterChain類:

  1. package com.lcq.filter;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.  
  6. public class FilterChain implements Filter {  
  7.     List<Filter> filters = new ArrayList<Filter>();  
  8.     int index = 0;  
  9.  
  10.     public FilterChain addFilter(Filter f) {  
  11.         this.filters.add(f);  
  12.         return this;  
  13.     }  
  14.  
  15.     @Override 
  16.     public void doFilter(Request request, Response response, FilterChain chain) {  
  17.         if (index == filters.size())  
  18.             return;  
  19.         Filter f = filters.get(index);  
  20.         index++;  
  21.         f.doFilter(request, response, chain);  
  22.     }  
  23. }  

在FilterChain中繼承了Filter接口,從而實現(xiàn)了doFilter方法,在FilterChain中又有一個index變量,該變量是用來標記當前訪問的是哪一個過濾器,這些過濾器是存放在ArrayList中的,這樣用戶在使用的時候就可以實現(xiàn)自己的過濾器,編寫自己的處理邏輯,從而將自己的過濾器添加到ArrayList中,再調(diào)用FilterChain的doFilter方法遍歷整個責任鏈。

下面我們編寫三個過濾器:

HTMLFilter類:

  1. package com.lcq.filter;  
  2.  
  3. /**  
  4.  * 過濾HTML中的腳本元素  
  5.  * @author lcq  
  6.  *  
  7.  */ 
  8. public class HTMLFilter implements Filter {  
  9.  
  10.     @Override 
  11.     public void doFilter(Request request, Response response,FilterChain chain) {  
  12.         request.requestStr = request.getRequestStr().replace("<""[")  
  13.                 .replace(">""] --------HTMLFilter");  
  14.         chain.doFilter(request, response, chain);  
  15.         response.responseStr += "--------HTMLFilter";  
  16.           
  17.     }  
  18.  
  19. }  

SesitiveFilter類:

  1. package com.lcq.filter;  
  2.  
  3. public class SesitiveFilter implements Filter {  
  4.  
  5.     @Override 
  6.     public void doFilter(Request request, Response response, FilterChain chain) {  
  7.         request.requestStr = request.getRequestStr().replace("敏感""  ")  
  8.                 .replace("貓貓""haha------SesitiveFilter");  
  9.         chain.doFilter(request, response, chain);  
  10.         response.responseStr += "------SesitiveFilter";  
  11.  
  12.     }  
  13.  
  14. }  

FaceFilter類:

  1. package com.lcq.filter;  
  2.  
  3. public class FaceFilter implements Filter {  
  4.  
  5.     @Override 
  6.     public void doFilter(Request request, Response response, FilterChain chain) {  
  7.         request.requestStr = request.getRequestStr().replace(":)",  
  8.                 "^V^-------FaceFilter");  
  9.         chain.doFilter(request, response, chain);  
  10.         response.responseStr += "-------FaceFilter";  
  11.  
  12.     }  
  13.  
  14. }  

***編寫測試類:

  1. package com.lcq.filter;  
  2.  
  3. public class Main {  
  4.     public static void main(String[] args) {  
  5.         String message = "敏感詞匯,重慶,<script> 躲貓貓 :)";  
  6.         Request request = new Request();  
  7.         request.setRequestStr(message);  
  8.         Response response = new Response();  
  9.         response.setResponseStr("response");  
  10.         FilterChain fc = new FilterChain();  
  11.         fc.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter());  
  12.  
  13.         FilterChain fc2 = new FilterChain();  
  14.         fc2.addFilter(new FaceFilter());  
  15.         fc.addFilter(fc2);  
  16.         fc.doFilter(request, response,fc);  
  17.         System.out.println("request = " + request.getRequestStr());  
  18.         System.out.println("response = " + response.getResponseStr());  
  19.     }  
  20.  
  21. }  

在上面的實例中應該注意兩個地方:

1.我們建立的FilterChain中繼承了Filter接口,所以在測試類中就可以像使用其他的過濾器一樣使用FilterChain,大大提高了靈活性;

2.對于實現(xiàn)責任鏈的訪問處理順序問題,該問題的解決使用的是遞歸的思想,從而使先調(diào)用的結(jié)點在處理返回結(jié)果時其調(diào)用過濾器的順序是相反的。這種解決方案在Struts和其他框架中實現(xiàn)過濾器和攔截器使用的較為普遍,并且十分巧妙。

 

原文鏈接:http://blog.csdn.net/liuchangqing123/article/details/7386912

【編輯推薦】

  1. Java中的Enum的使用與分析
  2. 按權(quán)重選取目標的Java算法
  3. 5種JavaScript調(diào)用函數(shù)的方法
  4. 談談Java的自動裝箱和拆箱
  5. 淺談Java中的幾種隨機數(shù)
責任編輯:林師授 來源: liuchangqing123的博客
相關(guān)推薦

2021-12-24 07:50:45

責任鏈模式設(shè)計

2010-04-01 09:10:03

PHP設(shè)計模式責任鏈模式

2024-01-30 13:15:00

設(shè)計模式責任鏈

2022-12-28 08:08:57

2023-09-26 00:27:07

設(shè)計模式鏈接

2023-06-05 07:55:31

2024-05-09 12:17:00

責任鏈設(shè)計模式

2020-11-17 09:32:57

設(shè)計模式責任鏈

2024-12-03 15:52:45

責任鏈Java

2022-11-01 08:46:20

責任鏈模式對象

2021-07-14 10:08:30

責任鏈模式加工鏈

2009-03-16 15:55:21

Java責任鏈模式

2021-08-14 08:17:49

Android設(shè)計模式OKHttp

2023-09-28 08:45:56

開源責任鏈模式

2021-06-05 17:59:00

責任鏈模式設(shè)計

2024-06-04 13:11:52

Python行為設(shè)計模式開發(fā)

2021-05-25 09:00:52

責任鏈模式設(shè)計模式面試經(jīng)歷

2018-08-03 08:37:31

設(shè)計模式IT項目GDPR

2025-01-03 10:32:26

Spring責任鏈模式

2021-02-11 09:13:27

責任鏈模式業(yè)務
點贊
收藏

51CTO技術(shù)棧公眾號