1. 程式人生 > >Java設計模式菜鳥系列(十八)責任鏈模式建模與實現

Java設計模式菜鳥系列(十八)責任鏈模式建模與實現

責任鏈模式(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、連結上的請求可以是一條鏈,可以是一個樹,還可以是一個環,模式本身不約束這個,需要自己去實現,同時,在一個時刻,命令只允許由一個物件傳給另一個物件,而不允許傳給多個物件。