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