责任链模式定义:
将能够处理同一类请求的对象连成一条链,所提交的请求沿链传递,链上的对象逐个判断是否有能力处理该请求,如果能,则自己处理,如果不能,则传递给链上的下一个对象。
责任链模式常见的使用场景:
1.接力赛跑
2.公司的公文审批
3.大学里,奖学金审批流程等。
责任链主要的作用:
责任链上的处理者,负责处理请求,客户只要将请求发送到责任链上即可,无须关心处理的细节和请求的传递,这样就将请求的发送者和请求的处理者解耦了。
责任链模式的优点:
1.将请求的发送者和请求的处理者解耦了。
2.允许动态的添加或减少请求的处理者,而且添加新的请求处理很方便。
责任模式的角色:
1.抽象处理者,它可以是一个接口或者抽象类,它抽象出处理请求的接口,规范子类处理请求的操作。
2.具体处理者:它实现处理请求的接口,如果自己符合条件,则自己处理,如果不符合,则传递给下一个责任链上的对象
下面的案例中,我们以学生申请奖学金,不同的奖学金的数目,由不同的领导(辅导员,系主任,校长)来处理。
/**
* 抽象处理者
* Created by Administrator
*/
public abstract class Leader {
protected String leaderName;
protected Leader nextLeader;
public Leader(String leaderName) {
this.leaderName = leaderName;
}
public void setNextLeader(Leader leader){
this.nextLeader=leader;
}
//抽象化处理请求的接口
public abstract void HandleRequest(BonusRequest bonusRequest);
}
/**
* 责任上的具体处理者(辅导员)
* Created by Administrator
*/
public class Instructor extends Leader {
public Instructor(String leaderName) {
super(leaderName);
}
@Override
public void HandleRequest(BonusRequest bonusRequest) {
if(bonusRequest.getMonryNumber()<=3000 && bonusRequest.getMonryNumber()>0){
Log.d("HandleRequest","辅导员:"+this.leaderName+"处理申请");
Log.d("HandleRequest","申请奖学金同学姓名:"+bonusRequest.getStudentName()+" 申请理由:"+bonusRequest.getReason()+" 奖金数目"+bonusRequest.getMonryNumber());
}else{
if(this.nextLeader != null){
this.nextLeader.HandleRequest(bonusRequest);
}
}
}
}
/**
* 责任上的具体处理者(系主任)
* Created by Administrator
*/
public class DepartmentHead extends Leader {
public DepartmentHead(String leaderName) {
super(leaderName);
}
@Override
public void HandleRequest(BonusRequest bonusRequest) {
if(bonusRequest.getMonryNumber()<=6000 && bonusRequest.getMonryNumber()>3000){
Log.d("HandleRequest","系主任:"+this.leaderName+"处理申请");
Log.d("HandleRequest","申请奖学金同学姓名:"+bonusRequest.getStudentName()+" 申请理由:"+bonusRequest.getReason()+" 奖金数目"+bonusRequest.getMonryNumber());
}else{
if(this.nextLeader != null){
this.nextLeader.HandleRequest(bonusRequest);
}
}
}
}
/**
* 责任上的具体处理者(校长)
* Created by Administrator
*/
public class Principal extends Leader {
public Principal(String leaderName) {
super(leaderName);
}
@Override
public void HandleRequest(BonusRequest bonusRequest) {
if(bonusRequest.getMonryNumber()<=10000 && bonusRequest.getMonryNumber()>6000){
Log.d("HandleRequest","校长:"+this.leaderName+"处理申请");
Log.d("HandleRequest","申请奖学金同学姓名:"+bonusRequest.getStudentName()+" 申请理由:"+bonusRequest.getReason()+" 奖金数目"+bonusRequest.getMonryNumber());
}else{
if(this.nextLeader != null){
this.nextLeader.HandleRequest(bonusRequest);
}else{
Log.d("HandleRequest","学校没有这么大的奖学金数目");
}
}
}
}
/**
* 请求的信息
* Created by Administrator
*/
public class BonusRequest {
private String studentName;
private int monryNumber;
private String reason;
public BonusRequest(String studentName, int monryNumber, String reason) {
this.studentName = studentName;
this.monryNumber = monryNumber;
this.reason = reason;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getMonryNumber() {
return monryNumber;
}
public void setMonryNumber(int monryNumber) {
this.monryNumber = monryNumber;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
客户端调用:(这个案例中,不同的奖学金数目,由不同的领导处理)
Leader instructor =new Instructor("张三");
Leader departmentHead=new DepartmentHead("李四");
Leader principal=new Principal("王五");
//设置责任链上,辅导员的下一个处理对象是系主任
instructor.setNextLeader(departmentHead);
//设置责任链上,系主任的下一个处理对象是校长
departmentHead.setNextLeader(principal);
BonusRequest bonusRequest=new BonusRequest("赵六",1000,"辅导说我的表现,可以申请奖学金");
instructor.HandleRequest(bonusRequest);
结果:
BonusRequest bonusRequest1=new BonusRequest("赵六",5000,"辅导说我的表现,可以申请奖学金");
instructor.HandleRequest(bonusRequest1);
结果:
BonusRequest bonusRequest2=new BonusRequest("赵六",10000,"辅导说我的表现,可以申请奖学金");
instructor.HandleRequest(bonusRequest2);
结果:
(奖学金数目<=3000 && 奖学金数目>0,辅导员自己处理,奖学金数目<=6000 && 奖学金数目>3000,辅导员转给系主任处理,奖学金数目<=10000 && 奖学金数目>6000,辅导员转给系主任,系主任转给校长处理)