前言:
感觉自己通过写博客可以将自己所学的知识更好的理解。好了回归正题
以前写代码的时候处理多种情况分支的时候,总是第一印象想到if else if else ,例如处理一个员工请假:请假不超过5天,主任可以批准,请假不超过10天,经理可以批准,请假不超过15天,总经理可以批准。
如果使用if else if来实现的话
Integer days=new Integer(10);
if(days<5)
{
//主任批准
}
else if (days<10) {
//经理批准
}
else if(days<15){
//总经理批准
}
else {
//是不想干了????
}
但是如果以后需要修改条件,比如要增加一个副总经理的话,修改就会很麻烦,不仅需要修改条件,而且还需要修改处理逻辑。
这样,责任链就可以很好的解决这样的问题。将每一个处理节点连接起来形成一条处理链条
这就像C语言中学习到的链表一样,如果这个节点符合处理的条件,那么就直接处理并输出,如果不符合那么就传递下一个节点。
目录
一、代码实现
一、类图
二、具体实现类
LeaveRequest:
public class LeaveRequest {
private String name;//请假人的名字
private String Reason;//请假理由
public LeaveRequest(String name, String reason, int days) {
super();
this.name = name;
Reason = reason;
Days = days;
}
private int Days;//请假天数
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getReason() {
return Reason;
}
public void setReason(String reason) {
Reason = reason;
}
public int getDays() {
return Days;
}
public void setDays(int days) {
Days = days;
}
}
Leader:
public abstract class Leader {
public String name;
public Leader(String name) {
super();
this.name = name;
}
protected Leader nextLeader;
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public abstract void HandleRequest(LeaveRequest leaveRequest);
}
Director:
public class Director extends Leader{
public Director(String name) {
super(name);
// TODO 自动生成的构造函数存根
}
@Override
public void setNextLeader(Leader nextLeader) {
// TODO 自动生成的方法存根
super.setNextLeader(nextLeader);
}
@Override
public void HandleRequest(LeaveRequest leaveRequest) {
// TODO 自动生成的方法存根
if(leaveRequest.getDays()<5)
{
System.out.println("员工"+leaveRequest.getName()+",请假的天数"+leaveRequest.getDays()+",请假理由"+leaveRequest.getReason());
System.out.println("处理人"+this.name);
}
else
{ //继续向下传导
if(this.nextLeader!=null)
{
nextLeader.HandleRequest(leaveRequest);
}
}
}
}
Manager
public class Manager extends Leader{
public Manager(String name) {
super(name);
// TODO 自动生成的构造函数存根
}
@Override
public void setNextLeader(Leader nextLeader) {
// TODO 自动生成的方法存根
super.setNextLeader(nextLeader);
}
@Override
public void HandleRequest(LeaveRequest leaveRequest) {
// TODO 自动生成的方法存根
if(leaveRequest.getDays()<10)
{
System.out.println("员工"+leaveRequest.getName()+",请假的天数"+leaveRequest.getDays()+",请假理由"+leaveRequest.getReason());
System.out.println("处理人"+this.name);
}
else
{ //继续向下传导
if(this.nextLeader!=null)
{
nextLeader.HandleRequest(leaveRequest);
}
}
}
}
Ceo
package ChainofRespon;
public class Ceo extends Leader{
public Ceo(String name) {
super(name);
// TODO 自动生成的构造函数存根
}
@Override
public void setNextLeader(Leader nextLeader) {
// TODO 自动生成的方法存根
super.setNextLeader(nextLeader);
}
@Override
public void HandleRequest(LeaveRequest leaveRequest) {
// TODO 自动生成的方法存根
if(leaveRequest.getDays()<20)
{
System.out.println("员工"+leaveRequest.getName()+",请假的天数"+leaveRequest.getDays()+",请假理由"+leaveRequest.getReason());
System.out.println("处理人"+this.name);
}
else
{ System.out.println("员工"+leaveRequest.getName()+",是不想干了??"+"请假"+leaveRequest.getDays()+"请假理由"+leaveRequest.getReason());
}
}
}
Client
public class Client {
public static void main(String[] args) {
Leader leader=new Director("小李");
Leader leader2=new Manager("小张");
Leader leader3=new Ceo("小弟弟");
leader.setNextLeader(leader2);
leader2.setNextLeader(leader3);
LeaveRequest leaveRequest=new LeaveRequest("小红","回英国谈情",10);
leader.HandleRequest(leaveRequest);
}
}
实现结果:
员工小红,请假的天数10,请假理由回英国谈情
处理人小弟弟
二、责任链模式的应用
- java中,异常模式就是一种责任链模式,一个try可以对应多个catch
- 当第一个catch不匹配类型,则自动跳到第二个catch
- javaScript语言中,事件的冒泡和捕获机制,java语言中,事件的处理采用观察者模式
- Servlet开发中,过滤器的链式处理
- Struts2中,拦截器的调用也是典型的责任链模式