責任鏈模式(Chain of Responsibility Pattern)在眾多的框架中使用的非常普遍,例如SpringMVC、SpringSecurity等。責任鏈模式就是要將執(zhí)行的邏輯串聯(lián)起來,同時可以隨時在鏈中的某一節(jié)點結束。那么下面用簡短的代碼來實現(xiàn)該模式
public class FilterChainTest {
/**
* 1,定義一個鏈的抽象
* */
interface Chain{
void doFilter(String request,String response) ;
}
/**
* 2,定義一個用于處理具體業(yè)務邏輯的接口
* */
interface Filter {
void doFilter(String request,String response,Chain chain);
}
/**
* 實現(xiàn)自定義的鏈
* */
public static class MyChain implements Chain{
private List<Filter> filters ;
private Iterator<Filter> iterator ;
public MyChain(List<Filter> filters){
this.filters = filters ;
iterator = filters==null?null:filters.listIterator() ;
}
/**
* 執(zhí)行責任鏈中保存的Filter實例。
* 是否要繼續(xù)執(zhí)行鏈上后續(xù)的Filter由具體的Filter決定【當然這只是一種策略,還可以
* 根據(jù)返回值來判斷是否要繼續(xù)執(zhí)行后續(xù)的Filter等】
* */
@Override
public void doFilter(String request, String response) {
if(iterator == null || !iterator.hasNext()){
return;
}
iterator.next().doFilter(request,response,this);
}
}
public static class MyFilter implements Filter{
private String msg ;
public MyFilter(String msg){
this.msg = msg ;
}
@Override
public void doFilter(String request, String response, Chain chain) {
System.out.println("hello " + msg);
//繼續(xù)執(zhí)行調用鏈后面的Filter
chain.doFilter(request,response);
System.out.println("finish " + msg);
}
}
public static void main(String[] args){
//創(chuàng)建多個Filter,并放入到集合
MyFilter filter1 = new MyFilter("first") ;
MyFilter filter2 = new MyFilter("second") ;
MyFilter filter3 = new MyFilter("third") ;
List<Filter> filterList = new ArrayList<>() ;
filterList.add(filter1) ;
filterList.add(filter2) ;
filterList.add(filter3) ;
//構造責任鏈對象,并開始執(zhí)行
MyChain myChain = new MyChain(filterList) ;
myChain.doFilter("request","response");
}
}
執(zhí)行后的打印結果
hello first
hello second
hello third
finish third
finish second
finish first