模式介绍
使用多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止。
应用场景
多个对象可以处理同一个请求,但具体由哪一个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中一个提交一个请。
需要动态指定一组对象处理请求。
代码例子
在生活中也会用到责任链模式,例如在公司里面的员工请假,首先要向主管请求,如果请假天数小的话,主管就直接批了,如果大的话,就要再向上一级领导请求了。
UML 图
请假对象
/**
* 请假对象
* @author S
*
*/
public class QingjiaRequest {
//请假人名
public String name;
//请假天数
public int days;
}
领导对象
/**
* 领导
* @author S
*
*/
public abstract class Leader {
//领导的下一级领导
public Leader nextLeader;
//设置领导的下一级领导
public void setNextLeader(Leader leader){
this.nextLeader = leader;
}
//处理请求
public abstract void handleRequest(QingjiaRequest request);
}
主管
/**
* 主管
* @author S
*
*/
public class Director extends Leader{
@Override
public void handleRequest(QingjiaRequest request) {
// TODO Auto-generated method stub
System.out.println(request.name+":请假"+request.days+"天");
if(request.days<=3){//小于3天
System.out.println("主管:批准");
}else{
System.out.println("主管:请假大于3天,需要请示上级");
if(this.nextLeader!=null){
this.nextLeader.handleRequest(request);
}
}
}
}
经理
* 经理
*/
public class Manager extends Leader{
@Override
public void handleRequest(QingjiaRequest request) {
System.out.println(request.name+":请假"+request.days+"天");
// TODO Auto-generated method stub
if(request.days<=5){
System.out.println("经理:请假小于5天,批准");
}else{
}
}
}
Main
/**
* 设计模式-责任链模式
* @author S
*
*/
public class Main {
public static void main(String args[]){
//小明请假2天
QingjiaRequest request = new QingjiaRequest();
request.name = "小明";
request.days = 2;
//小刚请假5天
QingjiaRequest request1 = new QingjiaRequest();
request1.name = "小刚";
request1.days = 5;
//主管
Leader director = new Director();
//经理
Leader manager = new Manager();
//主管指定下一级领导
director.setNextLeader(manager);
//处理请假
director.handleRequest(request);
director.handleRequest(request1);
}
}
打印
小明:请假2天
主管:批准
小刚:请假5天
主管:请假大于3天,需要请示上级
小刚:请假5天
经理:请假小于5天,批准