责任链模式(chain of responsibility)是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。
模式的职责
将能够处理同一类请求的对象连城一条链,锁提交的请求沿着链传递,链上的对象诸葛判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
模式的必要性
如果是上述的要求的话,其实用if,else也是可以完成的,但是为什么还有有这个模式呢?因为这样的话会有更好的扩展性和更容易处理。
模式的实现
//需要被责任链请求处理的对象
public class LeaveRequest {
private String emName;
private int day;
private String reason;
public LeaveRequest(String emName,int day,String reson){
super();
this.emName = emName;
this.day = day;
this.reason = reson;
}
public String getEmName() {
return emName;
}
public void setEmName(String emName) {
this.emName = emName;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
//责任链的抽象类
public abstract class Leader {
protected String name;
//下一个责任链对象的引用
protected Leader nextLeader;
public Leader(String name){
super();
this.name = name;
}
//下一个责任链对象的设定方法
public void setNextLeader(Leader leader){
this.nextLeader = leader;
}
//处理责任链请求的核心业务方法。
public abstract void handleRequest(LeaveRequest request);
}
//责任链的具体对象
public class Director extends Leader{
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的逻辑
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
//责任链的具体对象
class Manage extends Leader{
public Manage(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的逻辑
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
//责任链的具体对象
class GeneralManage extends Leader{
public GeneralManage(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的逻辑
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
模式的优势
其实调用部分处理者的创建以及处理者关系的设定可以通过配置文件来配置完成,而且该代码的可扩展性非常好,可以随意添加任何处理对象.
模式的扩展
可以创建一个链的对象,里面存储链表的链关系,可以更加方便的调用。