用代碼講清楚-責任鏈模式(一)

責任鏈模式

(Chain of Responsibility Pattern)
責任鏈模式相信很多人在工作中也接觸過。

  • javax.servlet.Filter
  • struts的攔截器
  • SpringMVC的攔截器
    那麼,接下來我們來進行更加深入的、直觀的瞭解。

講解重點

  1. 責任鏈示例代碼
  2. 鏈條與鏈條之間操作示範
  3. 自己實現簡單的鏈式編程

定義

顧名思義,責任鏈模式(Chain of Responsibility Pattern)爲請求創建了一個接收者對象的。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行爲型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。

上面的一大堆看不懂,那我們通過幾個例子進行解析,看完例子相信,你可以直接用自己的話,解釋什麼是責任鏈模式

舉個栗子

  • 父類接口Filter
/**
 * 爲了實現filter鏈條的順序執行依賴於上一個Filter的返回值
 * 修改Filter中的doFilter的返回類型爲boolean
 */
interface Filter {
   boolean  doFilter(Msg msg);
}
  • 一系列過濾器

過濾器

  • 鏈條類
//過濾鏈
class FilterChain implements Filter {
    List<Filter> filters = new ArrayList<>(16);

    //直接返回FilterChain,再進行add時代碼易讀性增大(鏈式編程)
    public FilterChain add(Filter filter) {
        filters.add(filter);
        return this;
    }

    public void remove(Filter filter) {
        filters.remove(filter);
    }

    public boolean doFilter(Msg msg) {
        for (Filter filter : filters) {
           if(!filter.doFilter(msg)){
               return false;
           }
        }
        return true;
    }
}
  • 測試程序
public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好:); <script> ,歡迎訪問 taobao.com ,大家都是996");

        FilterChain filterChain = new FilterChain();
        filterChain.add(new HtmlFilter()).add(new SensitiveFilter());

        FilterChain filterChain2 = new FilterChain();
        filterChain2.add(new EmjogFilter()).add(new UrlFilter());
/**
 *  讓FilterChain實現Filter接口,這個鏈條也可以當作是一個Filter加到別的鏈條上去
 */
        filterChain.add(filterChain2);

        filterChain.doFilter(msg);
        System.out.println(msg);
    }
}
  • 輸出
    輸出示例

結語

測試程序中將過濾器,分別放到了兩個FilterChain.
其一:演示責任鏈的工作流程
其二:演示鏈條與鏈條之間的處理
這樣就通過責任鏈模式,簡單的實現了過濾操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章