设计模式--责任链模式的简单实现以及思路

前言:

 感觉自己通过写博客可以将自己所学的知识更好的理解。好了回归正题

 以前写代码的时候处理多种情况分支的时候,总是第一印象想到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:

  Leader:

    Director:

    Manager

    Ceo

Client

  实现结果:

  二、责任链模式的应用


一、代码实现

 一、类图

二、具体实现类

    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,请假理由回英国谈情
处理人小弟弟

  二、责任链模式的应用

  1.             java中,异常模式就是一种责任链模式,一个try可以对应多个catch
  2.            当第一个catch不匹配类型,则自动跳到第二个catch
  3.            javaScript语言中,事件的冒泡和捕获机制,java语言中,事件的处理采用观察者模式
  4.             Servlet开发中,过滤器的链式处理
  5.           Struts2中,拦截器的调用也是典型的责任链模式

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值