定义:
责任链模式是对象的行为模式,在责任链模式里,很多对象由每一个对象对其下家的引用而链接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道哪一个对象处理此请求,这使得系统在不影响客户端的情况下动态的重新组织和分配责任。
角色列表:
抽象处理者角色(Handler):定义出一个处理请求的接口或者抽象类,如果需要,接口可以定义出一个方法以设定和返回对下家的引用。抽象方法规范了子类处理请求的操作。
具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,如果条件满足,具体处理者可以访问下家。
例子:
养牛场工人请假,小组长有1天的审批权限,如果大于1天小于3天,车间主任可以审批,如果大于3天,总经理有审批权限。
类图如下:
代码如下:
public abstract class Handler {
private Handler handler;
public abstract boolean approve(double day);
/**
* 获取handler
* @return handler handler
*/
public Handler getHandler() {
return handler;
}
/**
* 设置handler
* @param handler handler
*/
public void setHandler(Handler handler) {
this.handler = handler;
}
}
public class TeamLeader extends Handler{
public boolean approve(double day){
if(day<=1){
System.out.println("小组长批准");
return true;
}else{
System.out.println("小组长无权限,转交车间主任审批");
return getHandler().approve(day);
}
}
}
public class DeptLeader extends Handler {
public boolean approve(double day){
if(day<=3){
System.out.println("车间主任批准");
return true;
}else {
System.out.println("车间主任无权限,转交总经理审批");
return getHandler().approve(day);
}
}
}
public class Manager extends Handler {
@Override
public boolean approve(double day) {
// TODO Auto-generated method stub
System.out.println("总经理批准");
return true;
}
}
public class Client {
public static void main(String[] args){
TeamLeader team = new TeamLeader();
DeptLeader dept = new DeptLeader();
Manager manager = new Manager();
team.setHandler(dept);
dept.setHandler(manager);
System.out.println("小明请1天");
team.approve(1);
System.out.println("小强请2天");
team.approve(2);
System.out.println("小丽请5天");
team.approve(5);
}
}
运行结果如下:
纯的责任链模式与不纯的责任链模式:
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个,要么处理,要么不处理将责任传给下家,不允许出现处理了一部分然后再将责任传递给下家继续处理的情况,在纯的责任链模式里,一个请求必须被一个具体处理者对象所处理,在不纯的责任链模式里,请求可以最终不被具体处理者处理。
优点:
客户端不需要知道具体由谁来处理请求,也不需要了解处理者对象的结构,降低了客户端与处理者对象的耦合。