定义
创建多个对象,使这些对象形成一条链,并沿着这条链传递请求,直到链上的某一个对象决定处理此请求。
责任链模式涉及到的角色如下所示:
抽象处理者角色:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。
具体处理者角色:实现或者继承抽象这角色,具体逻辑根据实际的架构来定,后面会提到。
实战
抽象处理者角色代码:
public abstract class Handler {
private Handler nextHandler;
private int level;
public Handler(int level) {
this.level = level;
}
// 处理请求传递,注意final,子类不可重写
public final void handleMessage(Demand demand) {
if (level == demand.demandLevel()) {
this.report(demand);
} else {
if (this.nextHandler != null) {
System.out.println("事情太严重,需报告上一级");
this.nextHandler.handleMessage(demand);
} else {
System.out.println("我就是boss,没有上头");
}
}
}
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
// 抽象方法,子类实现
public abstract void report(Demand demand);
}
具体处理者角色,继承抽象处理者角色,在我们情景中有两个具体处理者,分别是技术经理和boss。
// 技术经理
public class TechnicalManager extends Handler {
public TechnicalManager() {
super(1);
}
@Override
public void report(Demand demand) {
System.out.println("需求:" + demand.detail());
System.out.println(getClass().getSimpleName() + ":小猿我挺你,这个需求不干");
}
}
// boss
public class Boss extends Handler {
public Boss() {
super(2);
}
@Override
public void report(Demand demand) {
System.out.println("需求:" + demand.detail());
System.out.println(getClass().getSimpleName() + ":你们打一架吧,打赢的做决定");
}
}
客户端
public class Client {
public static void main(String[] args) {
Demand demandA = new DemandA(); // 请求等级低
Demand demandB = new DemandB(); // 请求等级高
Boss boss = new Boss();
TechnicalManager technicalManager = new TechnicalManager();
technicalManager.setNextHandler(boss); // 设置下一级
technicalManager.handleMessage(demandA);
System.out.println("============================");
technicalManager.handleMessage(demandB);
}
}