设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)

将请求发送到链条上,只关心它传给谁,不关心传递过程与处理细节,将请求者与处理者进行解耦

  1. 定义
  2. 优点
  3. 缺点
  4. 角色
  5. 场景模拟

定义

为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

优点

解耦,可扩展,灵活,符合单一职责

缺点

不能保证每个请求一定被处理,请求没有明确的处理者

如果链子过长,会影响系统性能

搭链子需要靠客户端完成,增加了客户端的复杂性,如果搭错,可能形成环

角色

抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

具体处理者(Concrete Handler):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

客户类(Client):创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

场景模拟

王老板的下属打算请假,王老板给指定了一个请假规则

请假小于3天,上级领导可以审批

请假小于7天,需要部门领导审批

请假小于15天,需要王老板审批

请假大于15天,王老板表示不想干可以走人

传统方式实现就不举例了,很简单,一个if-else就可以实现

使用策略模式实现

调用

1
2
3
4
5
6
Handler directHandler = new DirectHandler();
Handler deptHandler = new DeptHandler();
Handler CEO = new CEOHandler();
directHandler.setNextHandler(deptHandler);
deptHandler.setNextHandler(CEO);
System.out.println(directHandler.handler(14) ? "多谢领导" : "打扰了");

输出

1
2
3
4
请假天数过长,交给上级领导审批...
请假天数过长,交给上级领导审批...
直系领导批了
多谢领导

抽象

1
2
3
4
5
6
public interface Handler {
//设置下一个处理者
void setNextHandler(Handler handler);
//处理
boolean handler(int day);
}

具体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DirectHandler implements Handler{
private Handler handler;

@Override
public void setNextHandler(Handler handler) {
this.handler = handler;
}

@Override
public boolean handler(int day) {
if (day < 3) {
System.out.println("直系领导批了");
return true;
}
System.out.println("请假天数过长,交给上级领导审批...");
//防止链条上错抛异常
return handler == null ? false : handler.handler(day);
}
}
//两个类省略,详情可查看git