@TOC
介绍
- 责任链模式 (Chain of Responsibility Pattern) , 为请求者创建一个接受者对象的链,这种模式对请求对发送者和请求者进行解耦。
- 责任链模式通常每个接收者都包含对另一个接收者都引用,如果一个对象不能处理该请求,那么他就会把相同的请求传给下一个接收者解耦,以此类推。
-
这种类型的设计模式属于行为型模式。
- Handler : 抽象的处理者,定义类一个处理请求的接口,同时还含义另外的Handler
- ConcreteHandler : 是具体处理者,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则就将该请求转发给它的后继者。
案例
OA系统采购审批项目
- 采购员采购公司用品
- 如果金额小于等于5000,由小组长审批。
- 如果金额小于等于10000,交由项目经理审批。
- 如果金额小于等于30000,由总监审批。
- 如果大于30000,由总经理审批。
创建审批对象
@Data
@ToString
public class PurchaseRequest {
private Integer type;
private BigDecimal price;
private Integer id = 0;
public PurchaseRequest(Integer type, BigDecimal price, Integer id) {
this.type = type;
this.price = price;
this.id = id;
}
}
抽象审批类 Approver 相当于责任链模式中的 Handler
public abstract class Approver {
/**
* 下一个处理者
*/
Approver approver;
/**
* 名称
*/
String name;
public Approver() {
}
public Approver(String name) {
this.name = name;
}
public Approver getApprover() {
return approver;
}
public void setApprover(Approver approver) {
this.approver = approver;
}
/**
* 处理审批的方法
* @param purchaseRequest
*/
public abstract void processRequest(PurchaseRequest purchaseRequest);
}
组长审批类 DepartmentApprover 相当于责任链模式中的 ConcreteHandler
public class DepartmentApprover extends Approver{
public DepartmentApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice().compareTo(new BigDecimal("5000.00"))==-1){
System.out.println("当前ID"+purchaseRequest.getId()+"被"+this.name+"处理");
}else{
approver.processRequest(purchaseRequest);
}
}
}
部门经理审批类 PmApprover 相当于责任链模式中的 ConcreteHandler
public class PmApprover extends Approver{
public PmApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice().compareTo(new BigDecimal("10000.00"))==-1){
System.out.println("当前ID"+purchaseRequest.getId()+"被"+this.name+"处理");
}else{
approver.processRequest(purchaseRequest);
}
}
}
部门总监审批类 MdApprover 相当于责任链模式中的 ConcreteHandler
public class MdApprover extends Approver{
public MdApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice().compareTo(new BigDecimal("30000.00"))==-1){
System.out.println("当前ID"+purchaseRequest.getId()+"被"+this.name+"处理");
}else{
approver.processRequest(purchaseRequest);
}
}
}
总经理 审批类 GmApprover 相当于责任链模式中的 ConcreteHandler
public class GmApprover extends Approver{
public GmApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice().compareTo(new BigDecimal("30000.00"))==1){
System.out.println("当前ID"+purchaseRequest.getId()+"被"+this.name+"处理");
}
}
}
客户端
public class Client {
public static void main(String[] args) {
PurchaseRequest purchaseRequest = new PurchaseRequest(1,new BigDecimal("3000"),1);
DepartmentApprover departmentApprover = new DepartmentApprover("张组长");
PmApprover pmApprover = new PmApprover("张经理");
MdApprover mdApprover = new MdApprover("李总监");
GmApprover gmApprover = new GmApprover("李总经理");
departmentApprover.setApprover(pmApprover);
pmApprover.setApprover(mdApprover);
mdApprover.setApprover(gmApprover);
departmentApprover.processRequest(purchaseRequest);
}
}
优点和缺点
优点:
1)将请求和处理分开,实现解耦,提高系统的灵活性
2)简化了对象,使对象不需要知道链的结构
缺点:
1)性能会收到影响,特别是在链比较长的时候
2)不能保证请求一定被接收
适用场景:
1) 有多个对象可以处理同一个请求 : 多级请求 、请假/加薪请求
注 : 23种设计模式的讲解到此结束啦!!后面会一直完善
github Demo地址 : ~~~传送门~~~
个人博客地址:http://blog.yanxiaolong.cn/