• 面试设计模式-责任链模式


    一 责任链模式

    1.1 概述

    在进行请假申请,财务报销申请,需要走部门领导审批,技术总监审批,大领导审批等判断环节。存在请求方和接收方耦合性太强,代码会比较臃肿,不利于扩展和维护。

    1.2 责任链模式

    针对上面,使用责任链模式,将请求方和接收方的业务进行解耦,客户端发送一个请求,由一个抽象的处理请求的类 Handler 来接受这个请求,而具体怎么处理请求,就由 Handler 的子类来完成处理请求方法的实现,每个子类满足条件则自己处理,不满足调用下一个处理子类进行处理,以此类推,形成一条处理的链条。

    1.3 代码实现

    1.采购请求类

    1. package com.ljf.day0905;
    2. /**
    3. * @ClassName: ClientRequest
    4. * @Description: TODO
    5. * @Author: admin
    6. * @Date: 2023/09/05 21:55:41 
    7. * @Version: V1.0
    8. **/
    9. public class ClientRequest {
    10. /* 请求类型 */
    11. private int type = 0;
    12. /* 请求金额 */
    13. private float price = 0.0f;
    14. /* 请求编号 */
    15. private int id = 0;
    16. /**
    17. * 全参构造
    18. *
    19. * @param type
    20. * @param price
    21. * @param id
    22. */
    23. public ClientRequest(int type, float price, int id) {
    24. this.type = type;
    25. this.price = price;
    26. this.id = id;
    27. }
    28. public int getType() {
    29. return type;
    30. }
    31. public float getPrice() {
    32. return price;
    33. }
    34. public int getId() {
    35. return id;
    36. }
    37. }

    2.审批抽象类

    1. package com.ljf.day0905;
    2. /**
    3. * @ClassName: Approver
    4. * @Description: TODO
    5. * @Author: admin
    6. * @Date: 2023/09/05 21:56:49 
    7. * @Version: V1.0
    8. **/
    9. public abstract class Approver {
    10. /* 审批人姓名 */
    11. protected String name;
    12. /* 下一个审批人 */
    13. protected Approver approver;
    14. /**
    15. * 创建审批人要指定姓名
    16. *
    17. * @param name
    18. */
    19. public Approver(String name) {
    20. this.name = name;
    21. }
    22. /**
    23. * 指定下一个审批人
    24. *
    25. * @param approver
    26. */
    27. public void setApprover(Approver approver) {
    28. this.approver = approver;
    29. }
    30. /**
    31. * 抽象的审批方法
    32. *
    33. * @param purchaseRequest
    34. */
    35. public abstract void approve(ClientRequest purchaseRequest);
    36. }

    3.子类来继承抽象审批类

    3.1 DeaprtLeader

    1. package com.ljf.day0905;
    2. /**
    3. * @ClassName: DeaprtLeader
    4. * @Description: TODO
    5. * @Author: admin
    6. * @Date: 2023/09/05 21:58:10 
    7. * @Version: V1.0
    8. **/
    9. public class DeaprtLeader extends Approver {
    10. /**
    11. * 创建审批人要指定姓名
    12. *
    13. * @param name
    14. */
    15. public DeaprtLeader(String name) {
    16. super(name);
    17. }
    18. /**
    19. * 教学主任审批逻辑
    20. *
    21. * @param purchaseRequest
    22. */
    23. public void approve(ClientRequest purchaseRequest) {
    24. if (purchaseRequest.getPrice() <= 5000) {
    25. System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
    26. this.name + "处理");
    27. } else {
    28. approver.approve(purchaseRequest);
    29. }
    30. }
    31. }

    2.BossLeader

    1. package com.ljf.day0905;
    2. /**
    3. * @ClassName: BossLeader
    4. * @Description: TODO
    5. * @Author: admin
    6. * @Date: 2023/09/05 21:59:23 
    7. * @Version: V1.0
    8. **/
    9. public class BossLeader extends Approver{
    10. /**
    11. * 创建审批人要指定姓名
    12. *
    13. * @param name
    14. */
    15. public BossLeader(String name) {
    16. super(name);
    17. }
    18. /**
    19. * 院长审批逻辑
    20. *
    21. * @param purchaseRequest
    22. */
    23. public void approve(ClientRequest purchaseRequest) {
    24. if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <=
    25. 10000) {
    26. System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
    27. this.name + "处理");
    28. } else {
    29. approver.approve(purchaseRequest);
    30. }
    31. }
    32. }

    3.VicePrincipal

    1. package com.ljf.day0905;
    2. import com.sun.security.ntlm.Client;
    3. /**
    4. * @ClassName: VicePrincipal
    5. * @Description: TODO
    6. * @Author: admin
    7. * @Date: 2023/09/05 22:09:25 
    8. * @Version: V1.0
    9. **/
    10. public class VicePrincipal extends Approver {
    11. /**
    12. * 创建审批人要指定姓名
    13. *
    14. * @param name
    15. */
    16. public VicePrincipal(String name) {
    17. super(name);
    18. }
    19. /**
    20. * 副校长审批逻辑
    21. *
    22. * @param purchaseRequest
    23. */
    24. public void approve(ClientRequest purchaseRequest) {
    25. if (purchaseRequest.getPrice() > 10000 ) {
    26. System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
    27. this.name + "处理");
    28. } else {
    29. approver.approve(purchaseRequest);
    30. }
    31. }
    32. }

    4.测试

    1. package com.ljf.day0905;
    2. /**
    3. * @ClassName: TestZe
    4. * @Description: TODO
    5. * @Author: admin
    6. * @Date: 2023/09/05 22:00:19 
    7. * @Version: V1.0
    8. **/
    9. public class TestZe {
    10. public static void main(String[] args) {
    11. // 创建采购请求
    12. ClientRequest purchaseRequest = new ClientRequest(1, 33310000, 1);
    13. // 创建审批人
    14. Approver departmentApprover = new DeaprtLeader("团主任");
    15. Approver dean = new BossLeader("方院长");
    16. Approver vicePrincipal = new VicePrincipal("磊副校长");
    17. // Approver principal = new Principal("喜校长");
    18. // 设置下一个审批人
    19. departmentApprover.setApprover(dean);
    20. // 这里要形成一个环链,避免如果 30000 金额以下的请求
    21. // 直接交给校长处理,会出现空指针
    22. // 当然,如果程序规定只能从主任开始处理
    23. // 一层一层最后到校长处理,形成一个单链,这里就不用了设置了
    24. dean.setApprover(vicePrincipal);
    25. vicePrincipal.setApprover(departmentApprover);
    26. // principal.setApprover(departmentApprover);
    27. // 测试:入口
    28. departmentApprover.approve(purchaseRequest);
    29. }
    30. }

    5.结果

    责任链模式(Chain of Responsibility Pattern)_Myovlmx的博客-CSDN博客 

  • 相关阅读:
    【Linux 基础】df -h 的输出信息解读
    光致发光谱荧光量子效率测量系统
    平板用的触控笔什么牌子好?开学值得推荐的ipad手写笔
    Go:交互式提示工具go-prompt简介
    Linux mmap原理
    探索GIS+物联网应用场景 MapGIS IoT实时大数据解决方案
    基于SpringBoot的单应用项目模板(考虑到后期做微服务,内部已经做了拆分)
    隐入尘烟观后感
    回字文判断
    0027Java程序设计-房屋出租管理系统
  • 原文地址:https://blog.csdn.net/u011066470/article/details/132701998