责任链模式(ResponsibilityChainPattern)

本文通过一个请假审批的例子详细介绍了职责链模式的实现原理及其应用场景。该模式通过将多个处理对象组织成一条链来处理请求,使得请求的发送者与接收者解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本介绍:

    职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。

    生活中这种情况其实很常见,公司部门之中,政府部门之中都有体现,在公司部门中,当你提交一份请求文件给你的直接上级时,你的直接上级可以处理这个文件,若他觉得自己不够资格,会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到被某位感觉自己足够资格处理文件的人给处理掉为止,在政府部门也是如此。


示例代码实现:

package org.brando;

/**
 * 
 * 类说明: 代码运行测试.
 * @author Brando 2018年3月28日 上午10:51:49
 */
public class Launcher {

	public static void main(String[] args) {
		
		//初始化请假条.
		ApplicationForLeave apply = new ApplicationForLeave();
		apply.somebody = "Brando";
		apply.something = "去度假.";
		apply.hour = 72;
		
		//初始化各个负责人.
		ProjectManager pm = new ProjectManager();	//项目经理
		ProjectCharge pc = new ProjectCharge();		//项目主管
		ProjectDirector pd = new ProjectDirector();	//项目总监
		
		//设置负责人的链式关系. 项目经理->项目主管->项目总监
		pm.setNext(pc);
		pc.setNext(pd);
		
		//从链头开始提交.
		pm.audit(apply);
		
		//请假结果.
		System.out.println("请假结果:" + apply.result);
	}
	
}

package org.brando;

/**
 * 
 * 类说明: 请假条
 * @author Brando 2018年3月28日 上午10:54:35
 */
public class ApplicationForLeave {

	/**某人**/
	public String somebody;
	/**某事**/
	public String something;
	/**请假时长**/
	public int hour;
	/**结果, true:同意, false:不同意**/
	public boolean result = false;
	
}

package org.brando;

/**
 * 
 * 类说明: 审核抽象类
 * @author Brando 2018年3月28日 上午11:12:24
 */
public abstract class AAudit {
	
	/**下一审核对象**/
	protected AAudit next;
	
	/**
	 * 
	 * 方法说明: 审核.
	 * @author Brando 2018年3月28日 上午11:13:02
	 */
	public abstract void audit(ApplicationForLeave apply);

	/**
	 * 
	 * 方法说明: 设置下一个审核对象.
	 * @author Brando 2018年3月28日 上午11:22:22
	 * @param next 下一个审核人.
	 */
	public void setNext(AAudit next) {
		this.next = next;
	}

}

package org.brando;

/**
 * 
 * 类说明: 项目经理类
 * @author Brando 2018年3月28日 上午11:10:16
 */
public class ProjectManager extends AAudit {

	@Override
	public void audit(ApplicationForLeave apply) {
		if(apply.hour <= 8) {
			apply.result = true;
		} else {
			if(this.next != null) {
				this.next.audit(apply);
			}
		}
	}
	
}

package org.brando;

/**
 * 
 * 类说明: 项目主管.
 * @author Brando 2018年3月28日 上午11:10:16
 */
public class ProjectCharge extends AAudit {

	@Override
	public void audit(ApplicationForLeave apply) {
		if(apply.hour <= 24) {
			apply.result = true;
		} else {
			if(this.next != null) {
				this.next.audit(apply);
			}
		}
	}
	
}

package org.brando;

/**
 * 
 * 类说明: 项目总监
 * @author Brando 2018年3月28日 上午11:10:16
 */
public class ProjectDirector extends AAudit {

	@Override
	public void audit(ApplicationForLeave apply) {
		if(apply.hour <= 40) {
			apply.result = true;
		} else {
			if(this.next != null) {
				this.next.audit(apply);
			}
		}
	}
	
}
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值