博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
责任链模式(chain of responsibility)
阅读量:4707 次
发布时间:2019-06-10

本文共 2981 字,大约阅读时间需要 9 分钟。

责任链模式定义:

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

 

责任链属于行为型模式的一种。行为型模式关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。

下面使用公司请假的例子来说明:

 

 

  创建请假请求者

package com.note.pattern.responsibility;public class  LeaveRequest {		private String name;	private int days;    private String reason;    	public LeaveRequest(String name, int days, String reason) {		super();		this.name = name;		this.days = days;		this.reason = reason;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public int getDays() {		return days;	}	public void setDays(int days) {		this.days = days;	}	public String getReason() {		return reason;	}	public void setReason(String reason) {		this.reason = reason;	}        	}

  创建Leader抽象类与不同级别的Leader作为实现子类,负责接收请假请求:

package com.note.pattern.responsibility;public abstract class Leader {		protected String name;	protected Leader nextLeader; //责任链上的后继对象		public Leader(String name) {		this.name = name;	}		//设定责任链上的后继对象	public void setNextLeader(Leader leader) {		nextLeader = leader;	}		/**     * 处理请求的核心的业务方法     * @param request     */    public abstract void handleRequest(LeaveRequest request);}/*** * 主任 */class Director extends Leader {	public Director(String name) {		super(name);	}	@Override	public void handleRequest(LeaveRequest request) {		if(request.getDays() < 3) {			System.out.println("员工:"+request.getName()+"请假,天数:"+request.getDays()+",理由:"+request.getReason());            System.out.println("主任:"+this.name+",审批通过!");		}else {			nextLeader.handleRequest(request);		}	}}/** * 经理 */class Manager extends Leader {	public Manager(String name) {		super(name);	}	@Override	public void handleRequest(LeaveRequest request) {		if(request.getDays() < 10) {			System.out.println("员工:"+request.getName()+"请假,天数:"+request.getDays()+",理由:"+request.getReason());            System.out.println("经理:"+this.name+",审批通过!");		}else {			nextLeader.handleRequest(request);		}	}}/** * 总经理 */class GeneralManager extends Leader {	public GeneralManager(String name) {		super(name);	}	@Override	public void handleRequest(LeaveRequest request) {		if(request.getDays() < 30) {			System.out.println("员工:"+request.getName()+"请假,天数:"+request.getDays()+",理由:"+request.getReason());            System.out.println("总经理:"+this.name+",审批通过!");		}else {			System.out.println("莫非"+request.getName()+"想辞职,居然请假"+request.getDays()+"天!");		}	}}

  

package com.note.pattern.responsibility;public class Client {	public static void main(String[] args) {		Leader a = new Director("张三");		Leader b = new Manager("李四");		a.setNextLeader(b);		Leader c = new GeneralManager("王五");		b.setNextLeader(c);				 //开始请假操作        LeaveRequest req1 = new LeaveRequest("TOM", 25, "回英国老家探亲!");        a.handleRequest(req1);	}}

责任链模式在开发中的应用场景:   

  Java中异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch;   

  javaScript中事件的冒泡和捕获机制; 
  Servlet开发中过滤器的链式处理; 
  Struts2中拦截器的调用;

 

转载于:https://www.cnblogs.com/zhaojianhua/p/8257707.html

你可能感兴趣的文章
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
SSH加固
查看>>
python 二维字典
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>