责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
优点
降低耦合度。它将请求的发送者和接收者解耦。
简化了对象。使得对象不需要知道链的结构。
增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
增加新的请求处理类很方便。
缺点
不能保证请求一定被接收。
系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
可能不容易观察运行时的特征,有碍于除错。
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
可动态指定一组对象处理请求。
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
抽象处理者(Handler)角色
public interface BudgetHandler {
void setNextHandler(BudgetHandler nextHandler);
boolean handle(int amount);
}
具体处理者(Concrete Handler)角色
public class CFO implements BudgetHandler{
private BudgetHandler nextHandler;
@Override
public void setNextHandler(BudgetHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public boolean handle(int amount) {
if(amount<50000){
System.out.println("CFO同意,希望你再接再厉,为公司做出更大的贡献。");
return true;
}
if (nextHandler!=null){
return nextHandler.handle(amount);
}
//已经没有更高级的管理层来处理了
System.out.println(String.format("%d太多了,回去好好看看能不能缩减一下",amount));
return false;
}
}
具体处理者(Concrete Handler)角色
public class Manager implements BudgetHandler{
private BudgetHandler nextHandler;
@Override
public void setNextHandler(BudgetHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public boolean handle(int amount) {
Objects.requireNonNull(nextHandler);
if (amount<5000){
System.out.println("小于5000块,我这个经理可以决定:同意");
return true;
}
System.out.println(String.format("%d超出Manager权限,请更高级管理层批复",amount));
return nextHandler.handle(amount);
}
}
具体处理者(Concrete Handler)角色
public class GroupLeader implements BudgetHandler{
private BudgetHandler nextHandler;
@Override
public void setNextHandler(BudgetHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public boolean handle(int amount) {
Objects.requireNonNull(nextHandler);
if (amount<1000){
System.out.println("小钱 批了");
}
System.out.println(String.format("%d超出GroupLeader权限,请更高级管理层批复",amount));
return nextHandler.handle(amount);
}
}
客户端
public class DogWang2Cor {
public static void main(String[] args) {
applyBudget();
}
public static void applyBudget(){
GroupLeader leader = new GroupLeader();
Manager manager = new Manager();
CFO cfo = new CFO();
leader.setNextHandler(manager);
manager.setNextHandler(cfo);
System.out.println(String.format("领导您好:需要购买一台Mac笔记本电脑,预算为%d 望领导批准", 95000));
if (leader.handle(1000)) {
System.out.println("谢谢领导");
} else {
System.out.println("巧妇难为无米之炊,只能划船了...");
}
}
}