定义:避免请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,沿着这条链传递请求,直到有对象处理它为止。

角色:

  • 抽象处理者:Handler
  • 具体处理者:ConcreteHandler
  • 客户类:Client

模式分析:

关键在于抽象处理者类的设计:很多对象由每一个对象对其下家的引用而连接在一起。

抽象处理者典型代码:

//审批者类:抽象处理者
abstract class Approver {
protected Approver successor; //定义后继对象
protected String name; //审批者姓名

public Approver(String name) {
this.name = name;
}

//设置后继者
public void setSuccessor(Approver successor) {
this.successor = successor;
}

//抽象请求处理方法
public abstract void processRequest(PurchaseRequest request);
}

具体处理者典型代码:

//董事长类:具体处理者
class ViceManager extends Approver {
public ViceManager(String name) {
super(name);
}
//具体请求处理方法
public void processRequest(PurchaseRequest request) {
if (request.getAmount() < 100000) {
System.out.println("副总经理" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。"); //处理请求
}
else {
this.successor.processRequest(request); //转发请求
}
}
}

客户端调用典型代码:轮流设置下家

position1.setSuccessor(position2);
position2.setSuccessor(position3);
position3.setSuccessor(position4);
position4.setSuccessor(meeting);
package com.c015;

public class Client {
public static void main(String[] args) {
Approver position1,position2,position3,position4,meeting; // 多个处理者
position1 = new Director("甲");
position2 = new PartManager("乙");
position3 = new ViceManager("丙");
position4 = new Manager("丁");
meeting = new Congress("职工大会");
//创建职责链
position1.setSuccessor(position2);
position2.setSuccessor(position3);
position3.setSuccessor(position4);
position4.setSuccessor(meeting);
//创建采购单
PurchaseRequest pr1 = new PurchaseRequest(5000,10001,"XXX");
position1.processRequest(pr1);

PurchaseRequest pr2 = new PurchaseRequest(45000,10002,"XXX");
position1.processRequest(pr2);

PurchaseRequest pr3 = new PurchaseRequest(77000,10003,"XXX");
position1.processRequest(pr3);

PurchaseRequest pr4 = new PurchaseRequest(150000,10004,"XXX");
position1.processRequest(pr4);

PurchaseRequest pr5 = new PurchaseRequest(800000,10005,"XXX");
position1.processRequest(pr5);
}
}

核心理解

职责链模式关键在于设置职责的下家!

抽象处理者类要有一个自身的对象作为成员属性变量,并通过一个set方法完成赋值,之后要提供一个具体处理的方法接口供子类重写!

后续的子类重写具体的处理办法,如果处理不了,再次调用父类的处理方法直接把请求交给下家来完成!

作者:​​靠谱杨​​​,

我可能不是天才,但我会努力成为人才。

更多日常分享尽在我的VX公众号:小杨的挨踢IT生活

职责链模式(Chain of Responsibility)_请求处理