(Chain of Responsibility Pattern)
責任鏈模式相信不少人在工做中也接觸過。java
顧名思義,責任鏈模式(Chain of Responsibility Pattern)爲請求建立了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行爲型模式。
在這種模式中,一般每一個接收者都包含對另外一個接收者的引用。若是一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。編程
上面的一大堆看不懂,那咱們經過幾個例子進行解析,看完例子相信,你能夠直接用本身的話,解釋什麼是責任鏈模式設計模式
/** * 爲了實現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.
其一:演示責任鏈的工做流程
其二:演示鏈條與鏈條之間的處理
這樣就經過責任鏈模式,簡單的實現了過濾操做。測試