设计模式-责任链模式

发布时间 2023-10-31 16:11:38作者: hasome

参考:https://blog.csdn.net/weixin_49561506/article/details/129789351

概念

责任链模式(Chin of Responsibility)是一种行为型设计模式,它通过将请求的发送者和接收者解耦来实现请求的处理。
责任链模式(Chin of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链子,并沿着这条链传递该请求,直到有一对象处理到它为止。

应用场景

  1. 处理请求需要多个对象协作,且不确定哪个对象能够处理请求。
  2. 需要动态指定能够处理请求的对象集合。
  3. 需要在不明确接收者的情况下,向多个对象中的一个或多个发送请求。
  4. 可以通过在运行时添加或删除处理器来改变请求处理的顺序。
  5. 当一个请求需要被多个对象进行处理时,可以使用责任链模式避免产生复杂的嵌套调用。
  6. 可以将责任链模式与其他设计模式结合使用,如装饰器模式、工厂模式等,以实现更加灵活的功能。

优缺点

优点

  1. 降低系统的耦合度:请求发送者和接收者之间不直接交互,而是通过责任链上的多个对象进行交互,从而降低了它们之间的耦合度。
  2. 增强系统的灵活性:可以动态地增加或删除处理器,从而改变请求的处理顺序和方式。
  3. 提高代码的可扩展性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。
  4. 提高代码的可维护性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。

缺点

  1. 请求可能没有被处理:如果没有任何一个处理器能够处理该请求,则该请求将被忽略。
  2. 系统性能可能受影响:由于责任链中可能包含大量的处理器,因此可能会影响系统的性能。

事例

利用责任链模式编制员工请假审批功能类

  1. 请求类
public class Request {
    int day;  //请假的天数
    Request(int day) {
        this.day = day;
    }
}
  1. 抽象处理者类Handler
public abstract class Handler {
    private Handler next;
 
    public Handler getNext() {
        return next;
    }
 
    public void setNext(Handler next) {
        this.next = next;
    }
    //定义抽象请求方法,子类要重写
    public abstract boolean handle(Request request);
}
  1. 三个具体处理者类
public class ZuZhang extends Handler{
 
    static int limit = 1;
 
    @Override
    public boolean handle(Request request) {
        if (request.day <= limit) {
            System.out.println("组长同意请假!");
            return true;
        }
        return getNext().handle(request);
    }
}
public class ZhuRen extends Handler{
    
    static int limit = 2;
    
    @Override
    public boolean handle(Request request) {
        if (request.day <= limit) {
            System.out.println("主任同意请假!");
            return true;
        }
        return getNext().handle(request);
    }
}
public class JingLi extends Handler{
 
    static int limit = 3;
 
    @Override
    public boolean handle(Request request) {
        if (request.day <= limit) {
            System.out.println("经理同意请假!");
            return true;
        }
        return getNext().handle(request);
    }
}
  1. 生成责任链前后顺序关系类
public class MyChain {
    private Handler one = new ZuZhang();
    private Handler two = new ZhuRen();
    private Handler three = new JingLi();
    
    //生成责任链
    public void createChain() {
        one.setNext(two);
        two.setNext(three);
    }
    public void handle(Request request) {
        one.handle(request);
    }
}
  1. 测试类
public class Test {
    public static void main(String[] args) {
        Request request = new Request(3);
        MyChain myChain = new MyChain();
        myChain.createChain();
        myChain.handle(request);
    }
}
  1. 测试结果
    经理同意请假!