java_责任链接模式

news/2024/7/24 4:52:21

介绍:

避免请求发送者和接受者耦合在一起,让多个对象都有可能接收请求将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理它为止.

主要角色:

抽象处理者(Handler)

抽象处理者定义了一个处理请求的接口,它一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求方法.因为每个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个自类型(抽象处理者类型)的对象,作为其对下家的引用

具体处理者(ConcreteHandler)

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

客户类(Client)

用于向链中提出最初的请求,客户类只需要关心链的源头,而无需关心请求的处理环节以及请求的传递过程

结构图:

使用场景(适用环境):

  1. 有多个对象可以处理同一个请求,具体哪个对象处理改请求由运行时刻自动确定.客户端只需要将请求提交到链上,无需关心请求对象处理是谁以及它是如何处理的
  2. 在不明确接收者的情况下,向多个请求中的一个提交一个请求,请求的发送与请求的处理者解耦,请求将沿着连传递,寻求相应的处理者
  3. 可动态指定一组对象处理请求.客户端可以动态创建责任链来处理请求,还可以动态改变链中处理者之间的先后顺序

优点:

  1. 降低耦合度.一个对象无需指定其他哪个对象处理请求
  2. 简化对象相互连接.请求处理对象仅需维持一个指向其后续者的引用,而不需维持它对所有候选者处理引用
  3. 增强对象的指派职责的灵活性.给对象分配职责时,责任链可以给我们带来更多的灵活性
  4. 增加新的请求处理类很方便

缺点:

  1. 不能保证请求一定会被接收,既然一个请求没有明确的接收者,那么不能保证它一定会处理
  2. 对于比较长的责任链,请求的处理可能设计到多个处理对象,系统性能收到一定的影响

案例:

某oa系统需要提供一个请教条审批模块,如果员工请假天数小于3天,主任可以审批改请教条,如果该员工请假天数大于等于3天小于10天,经理可以审批,如果超大于10天小于30天总经理可以审批,如果超过30天,总经理也不能审批,并且提供相应的拒绝信息

结构图:

代码:

请求类:

public abstract class Leader {
    protected String name;
    protected  Leader successor;

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

    public void setSuccessor(Leader successor) {
        this.successor = successor;
    }
    public abstract void handleRequest(LeaveRequest request);
}

抽象处理者:

public class LeaveRequest {

    private String leaveName;

    private int leaveDays;

    public LeaveRequest(String leaveName, int leaveDays) {
        this.leaveName = leaveName;
        this.leaveDays = leaveDays;
    }

    public String getLeaveName() {
        return leaveName;
    }

    public void setLeaveName(String leaveName) {
        this.leaveName = leaveName;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

    public void setLeaveDays(int leaveDays) {
        this.leaveDays = leaveDays;
    }
}

具体处理者:

public class Director extends Leader {
    public Director(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() < 3) {
            System.out.println("主任" + name + "审批了员工"
                    + request.getLeaveName() + "请假条,请假天数为:"
                    + request.getLeaveDays());
        } else {
            if (this.successor != null) {
                this.successor.handleRequest(request);
            }
        }
    }
}
public class Manager extends Leader {
    public Manager(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() < 10) {
            System.out.println("经理" + name + "审批了员工"
                    + request.getLeaveName() + "请假条,请假天数为:"
                    + request.getLeaveDays());
        } else {
            if (this.successor != null) {
                this.successor.handleRequest(request);
            }
        }
    }
}
public class GeneralManager extends Leader {
    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() < 30) {
            System.out.println("总经理" + name + "审批了员工"
                    + request.getLeaveName() + "请假条,请假天数为:"
                    + request.getLeaveDays());
        } else {
            System.out.println("请假天数太多,不予假期!");
        }
    }
}

测试:

public static void main(String[] args) {

        //三个具体处理者
        Leader leader1 = new Director("老王");
        Leader leader2 = new Manager("老李");
        Leader leader3 = new GeneralManager("老赵");
        leader1.setSuccessor(leader2);
        leader2.setSuccessor(leader3);

        LeaveRequest request = new LeaveRequest("小王",2);
        leader1.handleRequest(request);
        LeaveRequest request2 = new LeaveRequest("小花",5);
        leader1.handleRequest(request2);
        LeaveRequest request3 = new LeaveRequest("小明",12);
        leader1.handleRequest(request3);
        LeaveRequest request4 = new LeaveRequest("小张",32);
        leader1.handleRequest(request4);
    }

结果:

 


http://www.niftyadmin.cn/n/1728624.html

相关文章

python单元测试框架对比_前端测试框架对比(js单元测试框架对比)

前端测试框架对比(js单元测试框架对比)本文主要目的在于横评业界主流的几款前端框架&#xff0c;顺带说下相关的一些内容。测试分类通常应用会有 单元测试(Unit tests) 和 功能测试(Functional tests)&#xff0c;复杂大型应用可能会有整合测试(Integration tests)。其中&#…

Vue中key属性的作用(实用)

转载&#xff1a; https://blog.csdn.net/zyj362633491/article/details/86654014

python 档案管理系统_Python的檔案導向API

無論看哪個文件&#xff0c;無論翻開哪本書籍&#xff0c;談到Python的檔案處理&#xff0c;一律就是介紹open函式的使用&#xff0c;再搭配一個開檔模式列表。承認吧&#xff01;每隔一段時間沒用&#xff0c;你就總是得再次確認那些r、w、x、a、等模式&#xff0c;到底代表哪…

springboot项目报错Field XXX in XXXX required a bean of type XXXXX that could not be found.

报错信息 Field messageUtil in com.syn.service.Impl.UserServiceImpl required a bean of type com.syn.util.MessageUtil that could not be found.The injection point has the following annotations:- org.springframework.beans.factory.annotation.Autowired(requiredt…

通过CASE WHEN 自定义排序

主要内容: ORDER BY CASE WHEN status 0 and delete_flag0 THEN 1 WHEN status 1 and delete_flag0 THEN 2 WHEN delete_flag 1 THEN 3 END asc, id desc 案例: select * from pf_cms where 11 ORDER BY CASE WHEN status 0 and delete_flag0 THEN 1 WHEN status 1 and…

python中用于表示逻辑与_在if语句中,Python等效于(逻辑与)

我在IF条件中遇到错误。我究竟做错了什么&#xff1f;得到a的原因SyntaxError是&&Python中没有运算符。同样||&#xff0c;!并且不是有效的 Python运算符。您可能从其他语言中了解到的某些运算符在Python中使用不同的名称。逻辑运算符&&和||实际上被称为and和o…

Vue中Object.assign()的使用详解

1.Object.assign()对象的拷贝2.Object.assign()对象的深拷贝3.对象的合并4.合并具有相同属性的对象5.继承属性和不可枚举属性是不能拷贝的6. 原始类型会被包装为对象7.异常打断后续拷贝任务1.Object.assign()对象的拷贝 Object.assign() 用于将所有可枚举属性的值从一个或多个…

vue中等号“=”赋值和Object.assign()拷贝的区别

总结&#xff1a; 目标对象源对象 1. 相当于引用&#xff0c;“你变我也变” Object.assign() 1.当源对象中属性是对象时&#xff0c; “属性&#xff1a;你变我不变&#xff0c;属性对象中的值:你变我也变” 2.当源对象中属性不是对象时&#xff0c;“你变我不变” JSON.pars…