使很多對象都有處理請求的機會從而避免請求的發送者和接受者之間的耦合關系將這些對象連成一條鏈並沿著這條鏈傳遞該請求直到有一個對象處理它為止責任鏈模式主要包括以下幾個角色處理者處理者是一個接口負責規定具體處理者處理用戶請求的方法以及具體處理者設置後繼處理對象的方法具體處理者具體處理者是實現處理接口的類的實例具體處理者通過調用處理接口規定的方法處理用戶的請求既在接到用戶的請求後處理者將調用接口規定的方法在執行該方法的過程中如果發現能處理用戶的請求就處理用戶的請求如果發現處理不了就交給下一個處理者進行處理
例如一個圖書檢索的程序根據圖書類別將圖書分為了N個種類然後創建若干個種類的對象每個對象對一個種類進行檢索為了能更好的管理這些對象可以將這額對象組織成一個責任鏈當用戶需要鑒定書籍時系統可以讓責任鏈上的第一個對象來處理用戶的請求這個對象首先檢索自己是否能夠處理用戶的請求如果能處理就反饋並返回處理內容如果不能處理則交給下一個處理對象進行處理
view plainprint?
package orgzhydesigndemo
/** * 處理接口* @author zhengyi * */ public interface Handler {
//根據書的ID進行檢索public abstract void Search(int id)
//下一個處理者 參數為實現處理接口的實現類public abstract void nextHandler(Handler han)}
view plainprint?
package orgzhydesigndemo
import javautilArrayListimport javautilList
/** * 文學類的書籍檢索* @author zhengyi * */ public class WenXue implements Handler{
private Handler han//下一個處理者private List<Integer> list //模擬文學類書籍的編號
public WenXue(){ list=new ArrayList<Integer>()listadd()listadd()listadd()listadd()listadd()}
@Override public void nextHandler(Handler han) { thishan=han //給下一個處理者賦值} @Override public void Search(int id) { if(ntains(id)){ //檢索list中是否存在此ID的書籍如果存在則打印Systemoutprintln(恭喜您您檢索的書籍是文學類的)}else{ //如果沒有此書籍則交給下一個處理者進行處理if(han!=null){ hanSearch(id)}
view plainprint?
package orgzhydesigndemo
import javautilArrayListimport javautilList
/** * 計算機類的書籍* @author zhengyi * */ public class JiSuanJi implements Handler {
private Handler hanprivate List<Integer> listpublic JiSuanJi(){ list=new ArrayList<Integer>()listadd()listadd()listadd()listadd()listadd()} @Override public void nextHandler(Handler han) { thishan=han} @Override public void Search(int id) { if(ntains(id)){ Systemoutprintln(恭喜你此書記在計算機類)}else{ if(han!=null){ hanSearch(id)}
view plainprint?
package orgzhydesigndemo
public class Appliction {
private Handler jisuanjiwenxue
public void createHandler(){ jisuanji=new JiSuanJi()wenxue=new WenXue()jisuanjinextHandler(wenxue) //指定下一個處理者}
public void search(int id){ jisuanjiSearch(id) //第一個處理者進行篩選處理}
public static void main(String[] args) { Appliction app=new Appliction()appcreateHandler()appsearch()}
適合使用責任鏈模式的情況在許多對象可以處理用戶請求的時候希望用戶不必明確處理者的時候同時向多個處理者發送請求程序希望動態的訂制可處理用戶請求的集合對象
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26543.html