终于把项目昨晚了,抽时间开始整理行为型的设计模式,责任链模式;
责任链模式概述:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
不是很理解,举个简单的例子:我要请10天年假,我就把请假申请提交给领导,本来请假5天以上的要大老板来审批,可是我不需要关心谁来处理这个请求,只要申请审批通过了就行。
首先建立抽象处理对象
public abstract class Handler {
/** 持有下一个处理请求的对象 */
protected Handler next = null;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
/**
* 抽象处理请求的方法
*/
public abstract void handleRequest(Integer day);
}
接着创建我的直属领导和大老板对象来处理我的请假申请
public class LeaderHandler extends Handler {
@Override
public void handleRequest(Integer day) {
/**
* leader只能审批五天以下的休假申请,五天以上的申请交给大老板处理
*/
if (day > 5) {
System.out.println("无法审批五天以上的休假申请,传递请求");
getNext().handleRequest(day);
} else {
System.out.println("处理申请,审批通过");
}
}
}
public class BossHandler extends Handler {
/**
* 大老板什么申请都可以处理
*/
@Override
public void handleRequest(Integer day) {
System.out.println("处理申请,审批通过");
}
}
客户端
// 组装责任链
Handler leader = new LeaderHandler();
Handler boss = new BossHandler();
leader.setNext(boss);
// 提交10天的休假请求
leader.handleRequest(10);
显示结果
无法审批五天以上的休假申请,传递请求
处理申请,审批通过
责任链的核心就是为了避免请求的发送者和处理者耦合在一起,于是将处理者组合成一条链,沿着链传递请求,直至某个点来处理这个请求。
这样做的好处是降低耦合,请求者不需要知道谁来最终处理这个请;同时增加了灵活性,当有新的类型的请求时,只需要在责任链中加一个处理该请求的类即可
缺点是一定程度的损耗了性能,调试起来也不太方便,必须要找到处理这个请求的具体对象。
责任链模式还分纯责任链和不纯的责任链,可根据实际情况应用;
纯责任链是保证每个请求最终都会有一个对象来处理它
不纯的责任链是请求传递结束后都没有一个对象处理它或者有多个对象来处理它
责任链模式的应用很普遍,我们常用的过滤器、拦截器就是使用的责任链模式。