23种设计模式之责任链模式

责任链模式是什么

为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象的记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

在责任链模式中,客户只需要将请求发送到责任链上即可,无需关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和处理者解耦了。

责任链模式的优缺点

责任链模式是一种对象行为型模式,其主要优点如下:

  • 降低了对象之间的耦合度。该模型使得一个对象无需知道到底是哪一个对象处理其请求以及链的结构,发送者和接受者也无需拥有对方的明确信息。
  • 增强了系统的可扩展性。可根据需要增加新的请求处理类,满足开闭原则。
  • 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链条内的成员或者调用他们的次序,也可以动态地新增或者删除责任。
  • 责任链条简化了对象之间的连接。每个对象只需要保持一个指向其后继者的引用,不需要保持其所有处理者的引用,这避免了使用众多的 if 或者 if…else语句
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

其主要缺点如下:

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接受者,所以不能保证它一定会被处理掉,该请求可能一直传递到链的末端都得不到处理。
  • 职责链比较长。对比较长的职责链,请求的处理可能涉及多个处理对象,会增加过多对象,而且会因为要等待链条处理完毕,会影响系统性能。
  • 职责链建立的合理性要考客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

责任链模式的结构图

责任链模式

简单实现java代码

public class LeaveApprovalTest {
	public static void main(String[] args) {
		//组装责任链
		Leader teacher1 = new ClassAdviser();
		Leader teacher2 = new DepartmentHead();
		Leader teacher3 = new Dean();
		//Leader teacher4=new DeanOfStudies();
		teacher1.setNext(teacher2);
		teacher2.setNext(teacher3);
		//teacher3.setNext(teacher4);
		//提交请求
		teacher1.handleRequest(8);
	}
}

//抽象处理者:领导类
abstract class Leader {
	private Leader next;

	public void setNext(Leader next) {
		this.next = next;
	}

	public Leader getNext() {
		return next;
	}

	//处理请求的方法
	public abstract void handleRequest(int LeaveDays);
}

//具体处理者1:班主任类
class ClassAdviser extends Leader {
	public void handleRequest(int LeaveDays) {
		if (LeaveDays <= 2) {
			System.out.println("班主任批准您请假" + LeaveDays + "天。");
		} else {
			if (getNext() != null) {
				getNext().handleRequest(LeaveDays);
			} else {
				System.out.println("请假天数太多,没有人批准该假条!");
			}
		}
	}
}

//具体处理者2:系主任类
class DepartmentHead extends Leader {
	public void handleRequest(int LeaveDays) {
		if (LeaveDays <= 7) {
			System.out.println("系主任批准您请假" + LeaveDays + "天。");
		} else {
			if (getNext() != null) {
				getNext().handleRequest(LeaveDays);
			} else {
				System.out.println("请假天数太多,没有人批准该假条!");
			}
		}
	}
}

//具体处理者3:院长类
class Dean extends Leader {
	public void handleRequest(int LeaveDays) {
		if (LeaveDays <= 10) {
			System.out.println("院长批准您请假" + LeaveDays + "天。");
		} else {
			if (getNext() != null) {
				getNext().handleRequest(LeaveDays);
			} else {
				System.out.println("请假天数太多,没有人批准该假条!");
			}
		}
	}
}

//具体处理者4:教务处长类
class DeanOfStudies extends Leader {
	public void handleRequest(int LeaveDays) {
		if (LeaveDays <= 20) {
			System.out.println("教务处长批准您请假" + LeaveDays + "天。");
		} else {
			if (getNext() != null) {
				getNext().handleRequest(LeaveDays);
			} else {
				System.out.println("请假天数太多,没有人批准该假条!");
			}
		}
	}
}

模式的使用场景

  1. 多对象可以处理一个请求,但具体由哪个对象处理该请求在运行时自动确定。
  2. 可以动态指定一组对象处理请求,或添加新的处理者
  3. 需要在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
责任链模式是一种行为型设计模式,它为请求创建了一个接收者对象的,将请求的发送者和接收者解耦。在责任链模式中,每个接收者都包含对下一个接收者的引用。如果一个接收者无法处理请求,它会将请求传递给下一个接收者,以此类推。这种模式的优点包括降低对象之间的耦合度、增强系统的可扩展性、增强给对象指派职责的灵活性、简化对象之间的连接以及实现责任分担。然而,责任链模式也有一些缺点,包括不能保证每个请求一定会被处理以及增加了客户端的复杂性。责任链模式适用于多个对象可处理同一个请求、请求处理者不明确或需要动态处理一组对象处理请求的情况。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [设计模式——职责模式](https://blog.csdn.net/zhengzhaoyang122/article/details/115189764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [设计模式责任链模式](https://blog.csdn.net/XGLLHZ/article/details/128391397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值