【校招VIP】什么是责任链模式?

05月12日 收藏 0 评论 1 java开发

【校招VIP】什么是责任链模式?

转载声明:文章来源https://blog.csdn.net/weixin_42146366/article/details/107635676

一、定义

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。

二、角色

Handler(抽象处理者):

定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象,作为其对下家的引用。通过该引用,处理者可以连成一条链。

ConcreteHandler(具体处理者):

它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。

三、注意事项

1、一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况;

2、一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情。

四、示例

① LeaveRequest:请假信息类。

import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class LeaveRequest {
// 请假人姓名
private String name;
// 请假天数
private int days;
}

② Handler:抽象处理者类。

import lombok.Data;
@Data
public abstract class Handler {
// 处理者姓名
protected String name;
// 下一个处理者
protected Handler nextHandler;

Handler(String name) {
this.name = name;
}
//处理请假
public abstract boolean process(LeaveRequest leaveRequest);
}

③ Director:主管处理者,实现了抽象处理类的 process 方法。

import java.util.Random;
/**
* 主管处理者
*/
public class Director extends Handler {
public Director(String name) {
super(name);
}

@Override
public boolean process(LeaveRequest leaveRequest) {
boolean result = (new Random().nextInt(10)) > 3;
// 不批准
if (result == false) {
return false;
} else if (leaveRequest.getDays() < 3) { // 批准且天数小于3,返回true
return true;
}
// 批准且天数大于等于3,提交给下一个处理者处理
return nextHandler.process(leaveRequest);
}
}

④ Manager:经理处理者,实现了抽象处理类的 process 方法。

import java.util.Random;<br>/**<br>* 经理处理者<br>*/<br>public class Manager extends Handler {<br>public Manager(String name) {<br>super(name);<br>}<br><br>@Override<br>public boolean process(LeaveRequest leaveRequest) {<br>// 随机数大于3则为批准,否则不批准<br>boolean result = (new Random().nextInt(10)) > 3;<br>if (result == false) {<br>return false;<br>} else if (leaveRequest.getDays() < 7) { // 批准且天数小于7<br>return true;<br>}<br>// 批准且天数大于等于7,提交给下一个处理者处理<br>return nextHandler.process(leaveRequest);<br>}<br>}

⑤ GeneralManager:总经理处理者,实现了抽象处理类的 process 方法。

import java.util.Random;
/**
* 总经理
*/
public class GeneralManager extends Handler {
public GeneralManager(String name) {
super(name);
}

@Override
public boolean process(LeaveRequest leaveRequest) {
// 随机数大于3则为批准,否则不批准
boolean result = (new Random().nextInt(10)) > 3;
if (result == false) { // 总经理不批准
return false;
}
// 总经理最后批准
return true;
}
}

⑥ Test:测试类。

public class Test {
public static void main(String[] args) {
Handler zhangsan = new Director("张三");
Handler lisi = new Manager("李四");
Handler wangwu = new GeneralManager("王五");

// 创建责任链
zhangsan.setNextHandler(lisi);
lisi.setNextHandler(wangwu);

// 发起请假申请
boolean result1 = zhangsan.process(new LeaveRequest(" 赵六", 2));
System.out.println("最终结果:" + result1);

boolean result2 = zhangsan.process(new LeaveRequest("孙七", 4));
System.out.println("最终结果:" + result2);

boolean result3 = zhangsan.process(new LeaveRequest("周八", 8));
System.out.println("最终结果:" + result3);
}
}

五、责任链模式的优缺点

优点:

对象仅需知道该请求会被处理即可,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度;
请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接;
在给对象分派职责时,职责链可以给我们更多的灵活性,可以在运行时对该链进行动态的增删改,改变处理一个请求的职责;
新增一个新的具体请求处理者时无须修改原有代码,只需要在客户端重新建链即可,符合 “开闭原则”。

缺点:

一个请求可能因职责链没有被正确配置而得不到处理;
可能因为职责链创建不当,造成循环调用,导致系统陷入死循环;
对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,且不方便调试。

C 1条回复 评论
每天烦躁专家

这篇文章写得不错 !

发表于 2022-12-01 22:00:00
0 0