目录
3、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接
4、具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
5、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求
一、基础简介
1、定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合。将这个对象连成一条链,并沿着这条链传递该请求,直到有对象处理该请求为止。
2、使用场景
- 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 3、可动态指定一组对象处理请求。
3、优缺点
优点:
- 1、降低耦合度。它将请求的发送者和接收者解耦。
- 2、简化了对象。使得对象不需要知道链的结构。
- 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 4、增加新的请求处理类很方便。
缺点:
- 1、不能保证请求一定被接收。
- 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 3、可能不容易观察运行时的特征,有碍于除错。
4、模式结构分析
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- Request:可包括多个属性,表示一个请求
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
二、实例实现
1、实例场景
小编在此就拿,我们常见的公司请假流程来举例:
- 请假1天,组长同意即可;
- 请假1-3天,主管同意即可;
- 请假3天以上,经理同意即可;
传统的处理方案是,申请者根据不同的天数,进行判断,调用对应“审批者”完成审批,这样对于一次请求的处理与“审批人”有着强耦合的关系,不利于流程的变更和功能的扩展。这个时候就可以使用——责任链模式。
2、Request :请求类
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:31
*
* @description 请假的请求类
*/
public class Rest_Request {
private String type;
private String content;
private int size;
public Rest_Request() {
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
3、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:26
*
* @description 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
*/
public abstract class Manager_Handler {
protected String name;
// 上一级管理者
protected Manager_Handler superior;
public Manager_Handler(String name) {
this.name = name;
}
// 设置上一级管理者
public void setSuperior(Manager_Handler superior){
this.superior = superior;
}
abstract public void requestApplication(Rest_Request request);
}
4、具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:35
*
* @description 组长:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
*
*/
public class GroupLeader_ConcreteHandler extends Manager_Handler {
public GroupLeader_ConcreteHandler(String name) {
super(name);
}
@Override
public void requestApplication(Rest_Request request) {
// 组长的权限是:审批请假1天以内的
if (request.getType().equals("请假") && request.getSize() <= 1 ) {
System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
} else {
// 其余申请转到上级
if (superior != null) {
superior.requestApplication(request);
}
}
}
}
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:35
*
* @description 主管:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
*
*/
public class ChargeLeader_ConcreteHandler extends Manager_Handler {
public ChargeLeader_ConcreteHandler(String name) {
super(name);
}
@Override
public void requestApplication(Rest_Request request) {
// 主管的权限是:审批请假1-3天
if (request.getType().equals("请假") && request.getSize() <= 3 ) {
System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
} else {
// 其余申请转到上级
if (superior != null) {
superior.requestApplication(request);
}
}
}
}
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:35
*
* @description 经理:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
*
*/
public class ManagerLeader_ConcreteHandler extends Manager_Handler {
public ManagerLeader_ConcreteHandler(String name) {
super(name);
}
@Override
public void requestApplication(Rest_Request request) {
// 经理的权限是:都可审批
if (request.getType().equals("请假") && request.getSize() <= 10 ) {
System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
} else {
System.out.println("请假这么久,你直接去财务结账走人吧————" + name);
}
}
}
5、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求
package com.mfc.design.职责链模式;
/**
* @author MouFangCai
* @date 2019/10/24 15:55
* @description
*/
public class Client {
public static void main(String[] args) {
GroupLeader_ConcreteHandler groupLeader = new GroupLeader_ConcreteHandler("小组长");
ChargeLeader_ConcreteHandler chargeLeader = new ChargeLeader_ConcreteHandler("主管");
ManagerLeader_ConcreteHandler managerLeader = new ManagerLeader_ConcreteHandler("经理");
// 设置对应的层级关系,可根据实际情况更改
groupLeader.setSuperior(chargeLeader);
chargeLeader.setSuperior(managerLeader);
Rest_Request request1 = new Rest_Request();
request1.setType("请假");
request1.setContent("小李请假");
request1.setSize(1);
groupLeader.requestApplication(request1);
request1 = new Rest_Request();
request1.setType("请假");
request1.setContent("小王请假");
request1.setSize(3);
groupLeader.requestApplication(request1);
request1 = new Rest_Request();
request1.setType("请假");
request1.setContent("小赖请假");
request1.setSize(10);
groupLeader.requestApplication(request1);
request1 = new Rest_Request();
request1.setType("请假");
request1.setContent("土豪请假");
request1.setSize(15);
groupLeader.requestApplication(request1);
}
}
7、结果展示
小李请假1天,被批准————小组长
小王请假3天,被批准————主管
小赖请假10天,被批准————经理
请假这么久,你直接去财务结账走人吧————经理Process finished with exit code 0