责任链模式
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的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