責任鏈模式
摘要
本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的UML,詳解介紹了責任鏈模式的原理及應用。本文可幫助讀者快速掌握責任鏈模式,以便工作學習中使用責任鏈模式。
一、責任鏈模式
在生活中,完成一項任務往往需要幾個步驟,步驟有前後排序之分,同時一個任務的步驟是有可能發生變化的,比如增加一個步驟,減少一個步驟。
編碼源於生活,某個任務類的一個功能也常常是由幾個步驟完成,如果將步驟寫死在任務類中,後期步驟的變化會導致修改任務類,這就違背了“開閉原則”。
責任鏈模式就是用於解決上面的問題。首先對任務類與步驟進行解耦,讓步驟單獨封裝成類,任務類只需要知道需要哪些步驟類即可,但這也導致使用者必須清楚一個功能需要的步驟。責任鏈模式借鑑List數據結構,步驟之間用鏈式結構進行連接,步驟一的下一個是步驟二,步驟二的下一個是步驟三,依次類推。所以使用者只需要知道鏈頭即可順着鏈子執行到最後,而不用關心步驟二步驟三是什麼。
二、責任鏈模式的實現
2.1 場景設計
在KFC中,客戶點漢堡的過程如下:
第一步,漢堡下單
第二步,KFC製作漢堡
第三步,KFC前臺叫號取餐
2.2 代碼實現
2.2.1 HamburgerHandler 任務抽象類
package ft.patterns.responsibilityChain;
public abstract class HamburgerHandler {
private HamburgerHandler nextHandler;
public HamburgerHandler() {
nextHandler = null;
}
public abstract void handler();
public void nextHandler(HamburgerHandler nextHandler) {
this.nextHandler = nextHandler;
}
public void doChain() {
if(nextHandler != null) {
nextHandler.handler();
}
}
}
2.2.2 HamburgerOder 步驟一具體類
package ft.patterns.responsibilityChain;
public class HamburgerOder extends HamburgerHandler {
@Override
public void handler() {
System.out.println("oder hamburger is aleardy.");
super.doChain();
}
}
2.2.3 HamburgerBuild 步驟二具體類
package ft.patterns.responsibilityChain;
public class HamburgerBuild extends HamburgerHandler{
@Override
public void handler() {
System.out.println("Build hamburger is aleady");
super.doChain();
}
}
2.2.4 HamburgerCalling 步驟三具體類
package ft.patterns.responsibilityChain;
public class HamburgerCalling extends HamburgerHandler{
@Override
public void handler() {
System.out.println("Hamburger is calling client");
super.doChain();
}
}
2.2.5 Main 測試類
package ft.patterns.responsibilityChain;
public class Main {
public static void main(String[] args) {
HamburgerHandler oder = new HamburgerOder();
HamburgerHandler build = new HamburgerBuild();
HamburgerHandler calling = new HamburgerCalling();
oder.nextHandler(build);
build.nextHandler(calling);
oder.handler();
}
}
2.2.6 測試結果
oder hamburger is aleardy.
Build hamburger is aleady
Hamburger is calling client