2025年3月30日 星期日 甲辰(龙)年 月廿九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 设计模式

【设计模式】18.行为型模式-职责链(Chain of Responsibility)

时间:02-01来源:作者:点击数:36

一、描述:

  把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

  角色:

  1.抽象处理者角色:定义处理的抽象方法,可以设置具体处理者

  2.具体处理者角色:实现抽象处理方法。

  (1)每个角色可处理它负责的请求,也可访问它的后继者。如果可处理该请求,就处理之。否则将该请求转发给它的后继者。

  3.请求角色:调用处理者。

  类图:

二、优点

  1.降低耦合度。

  2.增强了给对象指派职责的灵活性。

三、缺点

  1.不保证被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理。

四、适用场景

  1.有多个对象可以处理同一个请求,哪个对象处理该请求运行时刻自动确定。

  2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  3.可处理一个请求的对象集合应被动态指定。

五、举例

  以“员工请假”为例。请假天数不同,审核人员不同。流程图如下:

  代码:

  1.员工

  • @Data
  • public class Employee {
  • /**
  • * 姓名
  • */
  • private String name;
  • /**
  • * 请假天数
  • */
  • private Integer leaveDay;
  • }

  2.抽象处理类

  • public abstract class AbstractHandler {
  • public AbstractHandler handler;
  • /**
  • * 设置下个处理类
  • *
  • * @param handler
  • */
  • public void setNext(AbstractHandler handler) {
  • this.handler = handler;
  • }
  • /**
  • * 处理请假天数
  • */
  • public abstract void dealLeave(Employee employee);
  • }

  3.组长审核类

  • public class GroupLeaderHandler extends AbstractHandler {
  • @Override
  • public void dealLeave(Employee employee) {
  • if (employee.getLeaveDay() <= 2) {
  • System.out.println("组长已审核");
  • } else {
  • handler.dealLeave(employee);
  • }
  • }
  • }

  4.部门经理审核类

  • public class DepartmentManagerHandler extends AbstractHandler {
  • @Override
  • public void dealLeave(Employee employee) {
  • if (employee.getLeaveDay() <= 3) {
  • System.out.println("部门经理已审核");
  • } else {
  • handler.dealLeave(employee);
  • }
  • }
  • }

  5.CTO处理类

  • public class CTOHandler extends AbstractHandler {
  • @Override
  • public void dealLeave(Employee employee) {
  • if (employee.getLeaveDay() > 3) {
  • System.out.println("CTO已审核");
  • } else {
  • System.out.println("审核天数不在审核范围内");
  • }
  • }
  • }

  6.模拟请假

  • public class Client {
  • public static void main(String[] args) {
  • Employee employee = new Employee();
  • employee.setName("张三");
  • employee.setLeaveDay(5);
  • GroupLeaderHandler leaderHandler = new GroupLeaderHandler();
  • DepartmentManagerHandler departmentManagerHandler = new DepartmentManagerHandler();
  • CTOHandler ctoHandler = new CTOHandler();
  • leaderHandler.setNext(departmentManagerHandler);
  • departmentManagerHandler.setNext(ctoHandler);
  • leaderHandler.dealLeave(employee);
  • }
  • }

  效果:

在具体工作中,在验证访客信息的时候,网关系统用到了职责链模式。访客有公司内部系统,外部访问人员等,针对公司内部系统,需要一个固定的凭证,就可以进入系统,但是对于外部访问人员,需要动态校验token值。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门