責任鏈模式是一種對象的行爲模式。在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪個對象最終處理這個請求,這使得系統能夠在不影響客戶端的狀況下動態地從新組織和分配責任。設計模式
在如下條件下可考慮使用Chain of Responsibility:框架
1.有多個的對象能夠處理一個請求,哪一個對象處理該請求運行時刻自動肯定。ide
2.你想在不明確指定接受者的狀況下,想過個對象中的一個提交一個請求。測試
3. 可處理一個請求的對象集合應該被動態指定。this
回想到,Struts2就是基於Filter(StrutsPrepareAndExecuteFilter)來繼承的框架,Struts2中訪問Action共須要通過不少攔截器,在struts-default.xml文件中能夠進行查看,具體截圖以下:.net
恰巧如今放在在裝修,模仿Struts2攔截器的方式實現一下責任鏈設計模式,場景以下:如今不少的裝修公司都是承包制,大的裝修公司先在客戶手中承包下項目,而後交由中型裝修公司進行裝修,可是中型裝修公司可能還會將項目承包給小型裝修公司。這之間在裝修結束後固然會涉及到工程驗收了,那麼流程應該是小裝修公司本身先進行驗收,沒問題以後交於中型裝修公司驗收,以後再交於大型裝修公司驗收,最後交到個人手中。哇奧~個人房子居然被傳遞了這麼屢次(扯淡),廢話不說,代碼以下:debug
/**
*
* @describe:公共過濾器接口
* @author wenqi 2017年12月4日
*
*/
public interface Filter {
public void doFilter(Request request, Response response,FilterChain chain);設計
}
調試
/**
*
* @describe:請求的毛坯房
* @author wenqi 2017年12月5日
*
*/
public class Request {
public String RoughHouse;//毛坯房
public Request(String RoughHouse){
this.RoughHouse=RoughHouse;
}xml
}
/**
*
* @describe:響應的裝修房
* @author wenqi 2017年12月5日
*
*/
public class Response {
public String decorateHouse;//裝飾房
public Response(String decorateHouse){
this.decorateHouse=decorateHouse;
}
}
/**
*
* @describe:過濾器鏈
* @author wenqi 2017年12月5日
*
*/
public class FilterChain implements Filter{
List<Filter> filters=new ArrayList<Filter>();
private int index=0;
//將過濾器增長到當前過濾器鏈中
public FilterChain addFilter(Filter filter){
this.filters.add(filter);
return this;
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if(index==filters.size()){//當索引值等於過濾器總數時,直接返回
return;
}
Filter f=filters.get(index);//獲取當前過濾器
index++;
f.doFilter(request, response, chain);//執行當前過濾器方法
}
}
/**
*
* @describe:大型裝修公司過濾器
* @author wenqi 2017年12月5日
*
*/
public class BigCompanyFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"通過了【大】型裝修公司承包裝修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"通過了【大】型裝修公司承包驗收!");
}
}
/**
*
* @describe:中型裝修公司過濾器
* @author wenqi 2017年12月5日
*
*/
public class MiddlingFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"通過了【中】型裝修公司承包裝修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"通過了【中】型裝修公司承包驗收!");
}
}
/**
*
* @describe:小型裝修公司過濾器
* @author wenqi 2017年12月5日
*
*/
public class SmallFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println(request.RoughHouse+"通過了【小】型裝修公司承包裝修~");
chain.doFilter(request, response, chain);
System.out.println(response.decorateHouse+"通過了【小】型裝修公司承包驗收!");
}
}
/**
*
* @describe:測試類
* @author wenqi 2017年12月5日
*
*/
public class Test {
public static void main(String[] args) {
Request req=new Request("毛坯房");
Response res=new Response("裝修蓋");
//建立過濾器鏈
FilterChain chain=new FilterChain();
chain.addFilter(new BigCompanyFilter())
.addFilter(new MiddlingFilter())
.addFilter(new SmallFilter()
);
//按照順序執行過濾器的doFilter方法
chain.doFilter(req, res, chain);
}
}
運行結果:
毛坯房通過了【大】型裝修公司承包裝修~
毛坯房通過了【中】型裝修公司承包裝修~
毛坯房通過了【小】型裝修公司承包裝修~
裝修蓋通過了【小】型裝修公司承包驗收!
裝修蓋通過了【中】型裝修公司承包驗收!
裝修蓋通過了【大】型裝修公司承包驗收!
debug調試順序:
從其中的調試狀況能夠看出採用的是棧(先進後出)的方式進行的請求有響應。
其中的僞代碼以下:
if(大公司處理){
本身處理一部分
if(交給中型公司處理一部分){
中型公司處理一部分
if(交給小型公司處理一部分){
小型公司處理一部分
}else{
小型公司驗收
}
}else{
中型公司驗收
}
}else{
大公司驗收
}
以上就是責任鏈模式的實例。不知道你感受是這樣的嗎,哈哈