Java 责任链模式

责任链模式定义:

       将能够处理同一类请求的对象连成一条链,所提交的请求沿链传递,链上的对象逐个判断是否有能力处理该请求,如果能,则自己处理,如果不能,则传递给链上的下一个对象。

责任链模式常见的使用场景:

     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,辅导员转给系主任,系主任转给校长处理)

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值