前面讨論了建立型模式、結構型模式,今天我們來讨論一下行為型模式。責任鍊模式,就是我們讨論的第一種行為型模式。責任鍊模式具體不容易說出來,但是如果看一看責任鍊模式的實際例子就很容易明白了。最典型的例子就是Java EE Servlet中的過濾器,以鍊式方式對請求進行過濾了。當我們遇到類似需求的時候,也可以使用責任鍊模式來解決。
下面我們來模拟一下Java Servlet中的Filter。首先,需要請求和響應的接口和實作。這兩個接口都很簡單。
//請求
public interface Request {
String getMessage();
}
class RequestImpl implements Request{
private String msg;
public RequestImpl(String msg) {
this.msg = msg;
}
@Override
public String getMessage() {
return msg;
}
}
//響應
public interface Response {
String getMessage();
}
class ResponseImpl implements Response {
private String msg;
public ResponseImpl(String msg) {
this.msg = msg;
}
@Override
public String getMessage() {
return msg;
}
}
之後是過濾器的接口和實作。過濾器将會對請求和處理進行處理和過濾。過濾器1和2是正常的過濾器,過濾之後還會繼續調用鍊上的其它過濾器。而過濾器3則會直接阻斷鍊。
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
class FilterImpl1 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("In filter1: " + request.getMessage() + ":" + response.getMessage());
chain.doFilter(request, response);
}
}
class FilterImpl2 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("In filter2: " + request.getMessage() + ":" + response.getMessage());
chain.doFilter(request, response);
}
}
class FilterImpl3 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("In filter3: " + request.getMessage() + ":" + response.getMessage());
}
}
下面來實作責任鍊。責任鍊其實和很簡單,開始過濾之後,責任鍊就會不斷的調用鍊上的過濾器,直到某個過濾器判斷不需要繼續過濾(例如過濾器3)或者鍊到頭為止。為了讓這個鍊能夠複用,我還添加了目前調用鍊的标記current,标記調用到哪裡了,再到頭之後重新将current設定為0。
class FilterChain {
private List<Filter> filters;
private int current;
public FilterChain(List<Filter> filters) {
this.filters = filters;
current = 0;
}
void doFilter(Request request, Response response) {
if (current <= filters.size() - 1) {
Filter currentFilter = filters.get(current);
current++;
currentFilter.doFilter(request, response, this);
} else {
current = 0;
}
}
}
這樣一個責任鍊就完成了。我們來調用一下。
public void run() {
Filter filter1 = new FilterImpl1();
Filter filter2 = new FilterImpl2();
List<Filter> filters = new ArrayList<>();
filters.add(filter1);
filters.add(filter2);
FilterChain chain = new FilterChain(filters);
Request request = new RequestImpl("request1");
Response response = new ResponseImpl("response1");
chain.doFilter(request, response);
System.out.println();
filters.add(0,new FilterImpl3());
chain.doFilter(request, response);
}
結果應該類似這樣。和我們的預期相同。
責任鍊模式
In filter1: request1:response1
In filter2: request1:response1
In filter3: request1:response1