简介
由一个命令对象源和一系列处理对象组成,每个处理对象都包含定义其可以处理的命令对象类型的逻辑,其余的传递给链中的下一个处理对象,还有一种机制用于将新的处理对象添加到这个链的末尾,责任链相当于是if...elseif...elseif...else...endif,他的好处就是可以在运行时改变执行顺序,对系统更加松散耦合,该模式属于行为型。
职责链模式在结构上与装饰器模式几乎相同,不同之处在于,对于装饰器,所有类都处理请求,而对于责任链,链中的一个类恰好处理请求。
适用场景
1、一个请求的处理需要多个对象当中的一个或多个协作处理
优点
1、请求的发送者和接收者解耦
直接在发送请求的类中实现请求是不灵活的,因为它将类耦合到特定的接收方,使得不可能支持多个接收方。
2、责任链可以动态组合
这允许将请求发送到一个接收链,而不需要知道哪个接收链处理请求,请求沿着链传递,直到接收方处理请求,请求的发送方不再耦合到特定的接收方。
缺点
1、责任链太长或者处理时间过长,影响性能
2、责任链有可能过多
代码示例
员工类
public class Staff {
public String name;
/**
* 请假天数
*/
public Integer leaveDays;
public Staff() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(Integer leaveDays) {
this.leaveDays = leaveDays;
}
}
审批抽象类,这里需要把自己作为变量,并进行设值。
public abstract class Approve {
protected Approve approve;
public void setNextApprove(Approve approve){
this.approve = approve;
}
public abstract void pass(Staff staff);
}
部门审批类
public class DepartmentHeadApprove extends Approve {
@Override
public void pass(Staff staff) {
if(null != staff.getLeaveDays()){
//请假天数不为空,进入审批流程
System.out.println(staff.getName()+"的请假,部门领导批准了");
if(staff.getLeaveDays()>2 && null != approve){
//请假天数大于2天,需要更高级别的人审批
approve.pass(staff);
}
}else{
System.out.println(staff.getName()+"找死逗我玩呢");
}
}
}
CEO类
public class CEOApprove extends Approve {
@Override
public void pass(Staff staff) {
if(staff.getLeaveDays()>2){
System.out.println(staff.getName()+"的请假,ceo批准了");
if(null != approve){
approve.pass(staff);
}
}else{
System.out.println(staff.getName()+"找死逗我玩呢");
}
}
}
测试类
public class ChainTest {
public static void main(String[] args) {
Staff staff = new Staff();
staff.setName("李四");
staff.setLeaveDays(3);
Approve departmentHeadApprove = new DepartmentHeadApprove();
CEOApprove ceoApprove = new CEOApprove();
departmentHeadApprove.setNextApprove(ceoApprove);
departmentHeadApprove.pass(staff);
}
}
源码分析
servlet中应用
Filter
过滤器,
FilterChain
过滤器链路
MockFilterChain
是FilterChain
的实现类
LoggerContextFilter
是Filter
的实现类
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载