特點(diǎn)
1、每一個(gè)處理器都持有下一個(gè)處理器next弯院,當(dāng)當(dāng)前處理器能處理時(shí)圆存,則處理;當(dāng)不能處理時(shí)致燥,調(diào)用next進(jìn)行處理;
2排截、在調(diào)用方嫌蚤,用next的順序,決定處理器的處理順序断傲;
應(yīng)用場(chǎng)景
當(dāng)同一類問題脱吱,可能有不同的處理方式,但每一種條件只對(duì)應(yīng)唯一一種處理方式時(shí)认罩,可以使用責(zé)任鏈模式:
1箱蝠、web瀏覽器、windows窗口等垦垂,事件傳遞的實(shí)現(xiàn)宦搬。(當(dāng)同一個(gè)區(qū)域有多個(gè)組件層疊時(shí),通過責(zé)任鏈模式劫拗,來決定應(yīng)該由哪一個(gè)組件來響應(yīng)鼠標(biāo)的“點(diǎn)擊”事件)
2间校、面試常問題:如果代碼中if else過多,該如何優(yōu)化页慷?責(zé)任鏈模式可以優(yōu)雅地解決這個(gè)問題憔足;
思考
標(biāo)準(zhǔn)的責(zé)任鏈模式(如上圖1所示)中,需要使用next來決定處理順序酒繁,而且在request方法內(nèi)部還要寫與調(diào)用順序相關(guān)的代碼滓彰,簡(jiǎn)直太麻煩了。
然而java中州袒,天然具有“有序性”的東西是什么呢揭绑??
這就帶來了更簡(jiǎn)單的使用方式(僅屬個(gè)人淺見):
Trouble t = new Trouble();
List<AbstractHandler> handlerList = new LinkedList<>();
handlerList.add(new ConcreteHandler1(t));
handlerList.add(new ConcreteHandler2(t));
handlerList.add(new ConcreteHandler3(t));
...
for(int i = 0;i < handlerList.size(); i++){
AbstractHandler handler = handlerList.get(i);
if(handler.isAbleToHandler(t)){
handler.handle(t);
break;
}
if(i == handlerList.size() - 1){
throw new RuntimeException("未找到能處理的處理器郎哭,處理失斚醋觥弓叛!");
}
}
https://www.processon.com/view/link/5f2c109c5653bb1b611515ab