设计模式-责任链模式

本文介绍了责任链模式的概念、定义及应用场景,并通过一个请假审批的例子详细解释了如何在实际编程中应用这一模式。责任链模式能够使得多个对象有机会处理请求,避免了请求发送者和接收者之间的耦合。

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

1.责任链模式介绍

责任链模式,是行为型模式之一。我们将多个节点首尾相连所构成的模型称为链。对于链式结构,每个节点都可以被拆开再链接,因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端出发,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样一种模式称为责任链模式。

2.责任链模式的定义

使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

3.责任链模式的使用场景

多个对象可以处理同一请求,但具体由哪一个对象处理则在运行状态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。

4.责任链模式的UML类图



5.代码实现

在公司规定,请假3天以内由经理审批,请假5天以内由总监审批,请假5天以上由总经理审批。如果我们请假,将请假条交由经理处理。如果我们请假10天,超过了经理的处理权限,经理将假条提交至总监。10天假期又超过了总监的处理权限,总监由交由总经理审批,最终将假期审批下来。

假如有天请假,经理不在,我们又可直接找总监请假,具体代码该如何实现呢?

	1.抽象领导者
	/**
	 * 抽象领导者
	 * Created by Teaphy
	 * 2016/3/30.
	 */
	public abstract class Leader {
		protected Leader nextHandler;


		/**
		 * 处理请假请求
		 * @param days 请假天数
		 */
		public final void handlerRequest(int days) {
			if (days < limit()) {
				handle(days);
			} else {
				if (null != nextHandler) {
					nextHandler.handlerRequest(days);
				}
			}
		}


		/**
		 * 自身能批复的天数
		 * @return 具体天数
		 */
		public abstract int limit();


		/**
		 * 处理请假行为
		 * @param days 具体天数
		 */
		public abstract void handle(int days);
	}
	
	2. 具体领导者
	
	/**
	 * 具体领导者 - 经理
	 * Created by Teaphy
	 * 2016/3/30.
	 */
	public class Manager extends Leader {


		/**
		 * 自身能批复的天数
		 * @return 具体天数
		 */
		public int limit() {
			return 3;
		}


		/**
		 * 处理请假行为
		 * @param days 具体天数
		 */
		public void handle(int days) {
			System.out.println("Manager 审批假期" + days + "天");
		}
	}
		
	/**
	 * 具体领导者 - 总监
	 * Created by Teaphy
	 * 2016/3/30.
	 */
	public class Director extends Leader {


		/**
		 * 自身能批复的天数
		 * @return 具体天数
		 */
		public int limit() {
			return 5;
		}


		/**
		 * 处理请假行为
		 * @param days 具体天数
		 */
		public void handle(int days) {
			System.out.println("Director 审批假期" + days + "天");
		}
	}
	
	/**
	 * 具体领导者 - 总经理
	 * Created by Teaphy
	 * 2016/3/30.
	 */
	public class Boss extends Leader {


		/**
		 * 自身能批复的天数
		 * @return 具体天数
		 */
		public int limit() {
			return Integer.MAX_VALUE;
		}


		/**
		 * 处理请假行为
		 * @param days 具体天数
		 */
		public void handle(int days) {
			System.out.println("Boss 审批假期" + days + "天");
		}
	}
	
	3.测试类
	/**
	 * Created by Teaphy
	 * 2016/3/30.
	 */
	public class TestIteratorPattern {
		public static void main(String[] args) {
			Manager mManager = new Manager();
			Director mDirector = new Director();
			Boss mBoss = new Boss();


			// 设置Manager下一个节点
			mManager.nextHandler = mDirector;
			// 设置Director下一个节点
			mDirector.nextHandler = mBoss;


			/**
			 * 请假10天
			 */
			mManager.handlerRequest(10);


			/**
			 * 请假2天,但经理出差,交由总监审批
			 */
			mDirector.handlerRequest(2);
		}
	}
	
	4.输出结果
	Boss 审批假期10天
	Director 审批假期2天

6.总结

责任链模式的优点在于对请求者和处理者关系解耦,提高代码的灵活性。责任链模式的最大缺点是
对链中请求处理者的遍历,如果处理者太多,繁琐的遍历,必然会影响性能,尤其是在一些递归调用中。
在要求性能的应用中,慎重使用责任链模式。



参考资料

1.Android源码分析与设计模式

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值