標籤:
轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/40018231
責任鏈模式(ChainOfResponsibility): 有多個對象,每一個對象持有下一個對象的引用,形成一條鏈。請求在這條鏈上傳遞。直到某一對象決定處理該請求,可是發出者並不清楚終於哪個對象會處理該請求。
一、uml建模:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
二、代碼實現
/** * 責任鏈模式:有多個對象。每一個對象持有下一個對象的引用,形成一條鏈, * * 請求在這條鏈上傳遞,直到某一對象決定處理該請求, * * 可是發出者並不清楚終於哪個對象會處理該請求。 */interface Handler {public void operator();}/** * 這裡單獨對Handler進行封裝,方便改動引用對象 */abstract class AbstractHandler implements Handler {private Handler handler;public Handler getHandler() {return handler;}public void setHandler(Handler handler) {this.handler = handler;}}class MyHandler extends AbstractHandler implements Handler {private String name;public MyHandler(String name) {this.name = name;}@Overridepublic void operator() {if (getHandler() != null) {System.out.print(name + ",將BUG交給——>");/** * 這裡是關鍵。【注意1】這裡不是遞迴哦~ * * 遞迴:A(operator)——>A(operator)——>A(operator) * * 責任鏈:A(operator)——>B(operator)——>C(operator) */getHandler().operator();} else {System.out.println(name + "處理BUG...\n");}}}/** * client測試類 * * @author Leo */public class Test {public static void main(String[] args) {MyHandler handler1 = new MyHandler("技術總監");MyHandler handler2 = new MyHandler("專案經理");MyHandler handler3 = new MyHandler("程式猿");/** * 假設沒有下家,將會自行處理 * * 列印結果:技術總監處理BUG... */handler1.operator();/** * 僅僅要有下家,就傳給下家處理 * * 以下的列印結果:技術總監,將BUG交給——>專案經理。將BUG交給——>程式猿處理BUG... * * 就這樣,原本是技術總監自行處理的BUG,如今一層一層的把責任推給了程式猿去處理 */handler1.setHandler(handler2);handler2.setHandler(handler3);/** * 透過列印結果能夠知道:MyHandler執行個體化後將產生一系列相互持有的對象(handler)。構成一條鏈。 */handler1.operator();/** * 【注意2】責任鏈不是鏈表:鏈表有個頭結點,咱每次必須通過頭結點才幹訪問後面的節點 * * 而責任鏈它能夠從頭訪問。也能夠從中間開始訪問,如:handler2.operator(); */}}
三、總結
1、責任鏈模式能夠實現,在隱瞞client(不知道詳細處理的人是誰)的情況下,對系統進行動態調整。
2、連結上的請求能夠是一條鏈。能夠是一個樹,還能夠是一個環,模式本身不約束這個,須要自己去實現。同一時候,在一時間,命令只同意把對象和目標。而不是同意大量對象。
著作權聲明:本文部落格原創文章。部落格,未經同意,不得轉載。
Java設計模式偷跑系列(十八)建模和責任鏈模式的實現