Java設計模式菜鳥系列(十八)責任鏈模式建模與實現
阿新 • • 發佈:2019-02-18
責任鏈模式(ChainOfResponsibility): 有多個物件,每個物件持有下一個物件的引用,形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求,但是發出者並不清楚最終哪個物件會處理該請求。
一、uml建模:
二、程式碼實現
/** * 責任鏈模式:有多個物件,每個物件持有下一個物件的引用,形成一條鏈, * * 請求在這條鏈上傳遞,直到某一物件決定處理該請求, * * 但是發出者並不清楚最終哪個物件會處理該請求。 */ 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; } @Override public 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"); } } } /** * 客戶端測試類 * * @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、責任鏈模式可以實現,在隱瞞客戶端(不知道具體處理的人是誰)的情況下,對系統進行動態的調整。
2、連結上的請求可以是一條鏈,可以是一個樹,還可以是一個環,模式本身不約束這個,需要自己去實現,同時,在一個時刻,命令只允許由一個物件傳給另一個物件,而不允許傳給多個物件。