责任链模式

一、介绍

  1. 为请求创建了一个接收者对象的链。
  2. 请求的发送者和接收者进行解耦。 
  3. 每个接收者都有下一个接收者的节点。如果当前节点处理不了,就让下一个节点处理,依此类推。
  4. 使用场景
    1. 在处理消息的时候可以过滤很多道。
    2. Struts2 的拦截器
  5. 优点:
    1. 它将请求的发送者和接收者解耦
    2. 简化了对象。使得对象不需要知道链的结构
    3. 增强给对象指派职责的灵活性
    4. 通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
    5. 增加新的请求处理类很方便
  6. 缺点:
    1. 不能保证请求一定被接收
    2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用
    3. 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定

   

 


/**
 * 职位
 *
 * @author feizhou
 * @since 2020/7/10 20:37
 */
public abstract class ZhiWei {


    protected int fee;

    //责任链中的下一个元素
    protected ZhiWei next;

    public ZhiWei(int fee) {
        this.fee = fee;
    }


    public void baoXiao(int baoXiaoFee) {
        if (this.fee < baoXiaoFee) {
            show2(baoXiaoFee);
            next.baoXiao(baoXiaoFee);
        } else {
            show(baoXiaoFee);
        }

    }

    public void setNext(ZhiWei next) {
        this.next = next;
    }

    abstract void show(int baoXiaoFee);

    abstract void show2(int baoXiaoFee);
}


-------------
 

/**
 * 主管
 *
 * @author feizhou
 * @since 2020/7/10 20:34
 */

public class ZhuGuan extends ZhiWei {


    public ZhuGuan(int fee) {
        super(fee);
    }

    @Override
    void show(int baoXiaoFee) {
        System.out.println("主管报销的钱:" + baoXiaoFee);
    }

    @Override
    void show2(int baoXiaoFee) {
        System.out.println(baoXiaoFee + "钱,主管报销不了,进入下一个领导审批");
    }
}

------------

package com.example.demo.chaResponsibility;


import org.apache.logging.log4j.spi.AbstractLogger;

/**
 *  经理
 * @author feizhou
 * @since 2020/7/10 20:34
 */

public class JinLi extends ZhiWei {


    public JinLi(int fee) {
        super(fee);
    }

    @Override
    void show(int baoXiaoFee) {
        System.out.println("经理报销的钱:"+baoXiaoFee);
    }
    @Override
    void show2(int baoXiaoFee) {
        System.out.println(baoXiaoFee+"钱,经理报销不了,进入下一个领导审批");
    }
}

----------------
package com.example.demo.chaResponsibility;



/**
 *  总经理
 * @author feizhou
 * @since 2020/7/10 20:34
 */
public class ZongJinLi extends ZhiWei {


    public ZongJinLi(int fee) {
        super(fee);
    }

    @Override
    void show(int baoXiaoFee) {
        System.out.println("总经理报销的钱:"+baoXiaoFee);
    }
    @Override
    void show2(int baoXiaoFee) {
        System.out.println(baoXiaoFee+"钱,总经理报销不了,退回");
    }
}
--------------
package com.example.demo.chaResponsibility;


public class Test {


    public static void main(String[] args) throws InterruptedException {
        //设置链条规则
        ZhiWei zhiWei = buildLinkRule();
        //申请报销30
        zhiWei.baoXiao(2001);

    }

    /**
     * 设置链条规则
     *
     * @return com.example.demo.chaResponsibility.ZhiWei
     * @author feizhou
     * @since 2020/7/10 21:24
     */
    static ZhiWei buildLinkRule() {
        //
        //主管
        ZhiWei zhuGuan = new ZhuGuan(500);
        //经理
        ZhiWei jinLi = new JinLi(2000);
        //总经理
        ZhiWei zongJinLi = new ZongJinLi(20000);

        zhuGuan.setNext(jinLi);
        jinLi.setNext(zongJinLi);
        return zhuGuan;

    }

}
-------------
输出:
2001钱,主管报销不了,进入下一个领导审批
2001钱,经理报销不了,进入下一个领导审批
总经理报销的钱:2001

 

 

 

 

 

你可能感兴趣的:(设计模式)