設計模式之責任鏈模式

什麼是責任鏈模式


責任鏈設計模式主要構成有抽象處理者、具體處理者、客戶類,在處理請求的時候,將請求通過客戶類發送至處理鏈路上,這樣鏈路上所有處理對象都有機會處理請求,使發送者與接收者之間解耦。


使用場景


當請求到來時,不知道由哪個具體對象去處理或者每個對象都需要處理請求的時候,可以使用責任鏈模式。比如在論壇發表一篇文章,後臺需要經過一系列處理(過濾、敏感詞等)纔可以發表或進入數據庫,這時,就可以使用責任鏈模式,不同處理對象,使用不同的封裝類組裝成一個處理鏈路,使用這個處理鏈路去處理論壇發表文章的請求。

責任鏈的基本條件


要實現責任鏈模式,需要滿足該模式的基本條件:

  1. 對象鏈的組織。需要將某任務的所有責任執行對象以鏈的形式加以組織。
  2. 消息或請求的傳遞。將消息或請求沿着對象鏈傳遞,以讓處於對象鏈中的對象得到處理機會。
  3. 處於對象鏈中的對象的職責分配。不同對象完成不同的職責。
  4. 任務的完成。處於對象鏈的末尾的對象結束任務並停止消息或請求的繼續傳遞。

責任鏈模式的實現


我們編寫一個組裝車的處理接口,分別實現其組裝車頭、組裝車身、組裝車尾的處理類。

interface CarHandler {
	void handlerCar();//組裝車
}
class CarHeadHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("組裝車頭");
	}
}
class CarBodyHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("組裝車身");
	}
}
class CarTailHandler implements CarHandler {
	public void handlerCar() {
		System.out.println("組裝車尾");
	}
}

如果我們需要組裝一輛車,我們需要進行以下操作

CarHandler head = new CarHeadHandler();
CarHandler body = new CarBodyHandler();
CarHandler tail = new CarTailHandler();
head.handlerCar();
body.handlerCar();
tail.handlerCar();

假如我們想要使用責任鏈模式,我們需要使用一個類來鏈式地存儲我們的處理對象

//我們需要一個類負責存儲組裝對象引用
class CarChain {
	//用於存儲處理類對象
	private List<CarHandler> list = new ArrayList<CarHandler>();
	//需要有一個方法獲得處理類對象
	//同時返回當前類
	public CarChain add(CarHandler carHandler) {
		list.add(carHandler);
		return this;
	}
	public void handlerCar() {
		for (CarHandler carHandler : list) {
			carHandler.handlerCar();
		}
	}
}

我們組裝一輛車的操作就成了以下:

CarChain carChain = new CarChain();
carChain.add(new CarHeadHandler())
	.add(new CarBodyHandler())
	.add(new CarTailHandler());
carChain.handlerCar();

在這裏插入圖片描述上圖顯示了該執行流程,倘若我們想要將另一個carChain加入到當前carChain去執行,我們該怎麼做呢?
在這裏插入圖片描述
事實上,我們的CarChain同樣也可以去實現CarHandler接口,那麼,我們就可以實現下面的使用。

CarChain carChain = new CarChain();
carChain.add(new CarHeadHandler())
	.add(new CarBodyHandler())
	.add(new CarTailHandler());

CarChain carChain2 = new CarChain();
carChain2.add(new CarHeadHandler())
    .add(new CarBodyHandler())
	.add(new CarTailHandler());

carChain.add(carChain2);
carChain.handlerCar();

如果我們需要由CarChain中的某一個處理類來決定鏈條是否繼續,我們可以將接口方法handlerCar返回值改爲boolean類型。

boolean handlerCar();
//CarChain 中的handlerCar方法
public boolean handlerCar() {
	for (CarHandler carHandler : list) {
		if(!carHandler.handlerCar()) {
			return false;
		}
	}
	return true;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章