设计模式篇---职责链模式

文章目录

概念

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

比如大学期间,我们进行奖学金申请,100到1000是导员审批,1000到2000是系主任审批,2000到5000是院长审批。
每一个人审批的内容都是不同的,如果有一个审批者认为不符合自己的审批条件,则将审批流转到下一个人。而我们也只需要和导员提交申请,不需要关注后面的审批人。

结构

在这里插入图片描述
Handler(抽象处理者):它定义了一个处理请求的接口,由于不同的具体处理者处理请求的方式不同,每一个处理者的下家还是一个处理者,故在其定义了一个抽象处理者类型的对象作为下家的引用。
ConcreteHandler(具体处理者):在具体处理者中实现了抽象处理者中的方法,在处理请求之前需要进行判断,看是否具有相应的处理权限,有的话则处理,没有的话则将请求转发给后继者。

实例

某企业的采购系统包含一个审批的子系统,可以根据采购金额不同,由不同层次的主管人员来审批。主任审批5万元以下的,副董事长审批5w到10w的,董事长审批10w到50w的,50w以上的采购需要开董事会来讨论决定。
在这里插入图片描述

采购单类,充当请求类。

@Data
public class PurchaseRequest {
   

    // 采购金额
    private double amount;

    // 采购单编号
    private int number;

    // 采购目的
    private String request;

    public PurchaseRequest(double amount, int number, String request) {
   
        this.amount = amount;
        this.number = number;
        this.request = request;
    }

}

审批者的抽象类

public abstract class Approver {
   

    //定义后继对象
    protected Approver successor;

    protected String name;

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

    public void setSuccessor(Approver approver){
   
        this.successor = approver;
    }

    public abstract void processRequest(PurchaseRequest request);

}

主任类,充当具体处理者

public class Director extends Approver {
   

    public Director(String name) {
   
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {
   
        if (request.getAmount() < 50000) {
   
            System.out.println("主任:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");
        } else {
   
            this.successor.processRequest(request);
        }
    }
}

副董事长类

public class VicePresident extends Approver {
   
    public VicePresident(String name) {
   
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {
   
        if (request.getAmount() < 100000) {
   
            System.out.println("副董事长:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");
        } else {
   
            this.successor.processRequest(request);
        }
    }
}

董事长类

public class President extends Approver {
   
    public President(String name) {
   
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {
   
        if (request.getAmount() < 500000) {
   
                System.out.println("董事长:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");
        } else {
   
            this.successor.processRequest(request);
        }
    }
}

董事会

public class Congress extends Approver{
   

    public Congress(String name) {
   
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {
   
        System.out.println("召开董事会审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");
    }
}

客户端使用

public class Client {
   

    public static void main(String[] args) {
   

        Approver director = new Director("张三");
        Approver vicePresident = new VicePresident("李四");
        Approver president = new President("王五");
        Approver congress = new Congress("董事会");

        director.setSuccessor(vicePresident);
        vicePresident.setSuccessor(president);
        president.setSuccessor(congress);

        PurchaseRequest purchaseRequest1 = new PurchaseRequest(45000, 10001, "购买员工座椅");
        PurchaseRequest purchaseRequest2 = new PurchaseRequest(60000, 10002, "购买员工电脑");

        director.processRequest(purchaseRequest1);
        director.processRequest(purchaseRequest2);
    }
}

执行结果:
在这里插入图片描述

总结

职责链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递。请求发送者无需知道请求被谁处理,实现了请求发送者和处理者之间的解耦。
使用场景:
1、当多个对象可以处理同一个请求,但每个对象处理的方式、时机不同,可以考虑使用职责链。
2、在不明确指定接受者的情况下向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求,客户端动态的创建职责链来处理请求,还可以改变链中处理者之间的先后顺序。

相关推荐

  1. 设计模式 -职责模式

    2023-12-24 12:00:03       61 阅读
  2. 设计模式--职责模式

    2023-12-24 12:00:03       26 阅读
  3. 设计模式的应用——《职责模式

    2023-12-24 12:00:03       51 阅读
  4. 行为型设计模式职责模式

    2023-12-24 12:00:03       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-24 12:00:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-24 12:00:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-24 12:00:03       87 阅读
  4. Python语言-面向对象

    2023-12-24 12:00:03       96 阅读

热门阅读

  1. mysql参数配置binlog

    2023-12-24 12:00:03       48 阅读
  2. 【FLink消费Kafka之FlinkConsumer到KafkaSource的转变】

    2023-12-24 12:00:03       68 阅读
  3. Golang make vs new

    2023-12-24 12:00:03       60 阅读
  4. docker 安装mysql 8.0.35

    2023-12-24 12:00:03       47 阅读
  5. 力扣labuladong——一刷day78

    2023-12-24 12:00:03       65 阅读
  6. python自动开发,基础2

    2023-12-24 12:00:03       48 阅读
  7. Vue 3 表单处理精讲:打造响应式注册表单的艺术

    2023-12-24 12:00:03       54 阅读
  8. ClickHouse(19)ClickHouse集成Hive表引擎详细解析

    2023-12-24 12:00:03       47 阅读
  9. pytorch常用的几个函数详解

    2023-12-24 12:00:03       52 阅读
  10. [网络安全] 远程登录

    2023-12-24 12:00:03       57 阅读
  11. Vite和Webpack的优缺点

    2023-12-24 12:00:03       65 阅读
  12. Nodejs+Express搭建HTTPS服务

    2023-12-24 12:00:03       55 阅读
  13. C#编程语言的从入门到深入学习大纲

    2023-12-24 12:00:03       60 阅读