JAVA中的责任链模式(CH01)


责任链模式的关键在于每一个任务处理者都必须持有下一个任务处理者的作用

纯的责任链:纯的责任链是只能也必须只有一个任务处理者去处理这个任务,

          不会出现没有处理者处理的情况,也不会出现有多个处理者处理同一个任务

不纯的责任链:可以有多个任务处理者同时处理一个任务,那么就表示这个任务是大家一起共享的,或者也可以没有任何处理这去处理他

责任链:

这是一个简单的经费申请责任链。

客户端发请求申请经费,

申请经费从最小权限范围开始申请,如果权限不足则向上一级申请。

1:定义一个抽象类(AbstractHandler),抽象申请经费方法.

2:定义三个子类,继承 AbstractHandler 父类,实现抽象方法 execute(int money);

1:这个抽象定义自己本身,然后赋予get&set方法;

public abstract class AbstractHandler {
    
    //定义自己,给get&set方法
    private AbstractHandler handler;

    public AbstractHandler getHandler() {
        return handler;
    }

    public void setHandler(AbstractHandler handler) {
        this.handler = handler;
    }

    //抽象申请经费方法
    public abstract void execute(int money);
}

2:第一个子类,申请经费范围在小于或定于200内,

     做出判断,如果不在范围内,从新调用execute方法,

     此时的execute是下一级审批官的方法了在后面客户端main方法里面可以设置

a) money<=200

public class HandlerA extends AbstractHandler {

    @Override
    public void execute(int money) {
        if(money<=200){
            System.out.println("A审核通过…………");
        }else{
            getHandler().execute(money);
        }
    }
}

 b) money<=500

public class HandlerB extends AbstractHandler {
    @Override
    public void execute(int money) {
        if(money<=500){
            System.out.println("B审核可以通过…………");
        }else{
            getHandler().execute(money);
        }
    }
}

 c) money<=1000

     此时为最高一级

public class HandlerC extends AbstractHandler {
    @Override
    public void execute(int money) {
        if(money<=1000){
            System.out.println("C审核通过…………");
        }else{
            System.out.println("审超出预算");
        }
    }
}

  

  客户端

public class Main {
    public static void main(String[] args) {
      //实现三个不同级别权限的子类
        AbstractHandler A = new HandlerA();
        AbstractHandler B = new HandlerB();
        AbstractHandler C = new HandlerC();
     //给子类赋予下一个对应的级别 A.setHandler(B); B.setHandler(C); A.execute(300); } }

 输出结果为:A审核通过…………

后记:虽然发现很容易就完成了责任链,但是发现代码并不如意,耦合太高,后续一篇会对此进行优化

原文地址:https://www.cnblogs.com/javaLin/p/7883494.html