什麼是責任鏈模式
責任鏈設計模式主要構成有抽象處理者、具體處理者、客戶類,在處理請求的時候,將請求通過客戶類發送至處理鏈路上,這樣鏈路上所有處理對象都有機會處理請求,使發送者與接收者之間解耦。
使用場景
當請求到來時,不知道由哪個具體對象去處理或者每個對象都需要處理請求的時候,可以使用責任鏈模式。比如在論壇發表一篇文章,後臺需要經過一系列處理(過濾、敏感詞等)纔可以發表或進入數據庫,這時,就可以使用責任鏈模式,不同處理對象,使用不同的封裝類組裝成一個處理鏈路,使用這個處理鏈路去處理論壇發表文章的請求。
責任鏈的基本條件
要實現責任鏈模式,需要滿足該模式的基本條件:
- 對象鏈的組織。需要將某任務的所有責任執行對象以鏈的形式加以組織。
- 消息或請求的傳遞。將消息或請求沿着對象鏈傳遞,以讓處於對象鏈中的對象得到處理機會。
- 處於對象鏈中的對象的職責分配。不同對象完成不同的職責。
- 任務的完成。處於對象鏈的末尾的對象結束任務並停止消息或請求的繼續傳遞。
責任鏈模式的實現
我們編寫一個組裝車的處理接口,分別實現其組裝車頭、組裝車身、組裝車尾的處理類。
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;
}