【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)---行为型模式】

【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】

知识回顾:

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】。

责任链模式

  1. 责任链设计模式:为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
  2. 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。

解决的问题

  1. 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递,所以责任链将请求的发送者和请求的处理者解耦了。

生产开发中常用的使用场景

  1. Java中,异常机制就是一种责任链模式。
  2. Servlet开发中,过滤器的链式处理。
  3. 等等。。等等。。

责任链模式优点与缺点

优点
  1. 降低耦合度。它将请求的发送者和接收者解耦。
  2. 简化了对象。使得对象不需要知道链的结构。
  3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  4. 增加新的请求处理类很方便。
  5. 由于责任链的创建完全在客户端,因此新增新的具体处理者对原有类库没有任何影响,只需添加新的类,然后在客户端调用时添加即可。符合开闭原则。
缺点
  1. 不能保证请求一定被接收。
  2. 调用的时候可能会造成循环调用。

核心角色

Handler:处理请求的规则
ConcreteHandler: 处理请求的实现类
Client–Main:客户端测试类

UML类图

在这里插入图片描述

实现代码

我们实现这样一个栗子:学校请假的流程

• 如果请假天数小于5天,班主任审批
• 如果请假天数大于等于5天,小于15天,学办负责人审批
• 如果大于等于15天,小于30天,学院书记审批
• 如果大于等于30天,提示拒绝

封装一个对象类
class Request {

	private String username;

	private int leaveDays;

	private String reason;
	
	public Request(String username, int leaveDays, String reason) {
		super();
		this.username = username;
		this.leaveDays = leaveDays;
		this.reason = reason;
	}
	public String getEmpName() {
		return username;
	}
	public void setEmpName(String empName) {
		this.username = empName;
	}
	public int getLeaveDays() {
		return leaveDays;
	}
	public void setLeaveDays(int leaveDays) {
		this.leaveDays = leaveDays;
	}
	public String getReason() {
		return reason;
	}
	public void setReason(String reason) {
		this.reason = reason;
	} 
}
LeaderHandler 类
package com.responsibility;


public abstract class LeaderHandler {

	protected String name;
	
	protected LeaderHandler nextLeader; 
	
	public LeaderHandler(String name) {
		super();
		this.name = name;
	}
	
	public void setNextLeader(LeaderHandler nextLeader) {
		this.nextLeader = nextLeader;
	}
	
	public abstract void handleRequest(Request request);
}
ConcreteHeadTeacherHandler 类
package com.responsibility;

public class ConcreteHeadTeacherHandler extends LeaderHandler {

	public ConcreteHeadTeacherHandler(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if(request.getLeaveDays()<5){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("班主任:"+this.name+",审批通过!");
		}else{
			if(this.nextLeader!=null){
                System.out.println("班主任:无法审核,请找相关负责人。。。。");
				this.nextLeader.handleRequest(request);
			}
		}
	}
}
ConcreteDirectorHandler 类
package com.responsibility;

public class ConcreteDirectorHandler extends LeaderHandler {

	public ConcreteDirectorHandler(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if(request.getLeaveDays()<15){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("学办负责人:"+this.name+",审批通过!");
		}else{
			if(this.nextLeader!=null){
                 System.out.println("学办负责人:无法审核,请找相关负责人。。。。");
				this.nextLeader.handleRequest(request);
			}
		}
	}
}
ConcreteClerkHandler 类
package com.responsibility;

public class ConcreteClerkHandler extends LeaderHandler {

	public ConcreteClerkHandler(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if(request.getLeaveDays()<30){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("学院书记:"+this.name+",审批通过!");
		}else{
			if(this.nextLeader!=null){
                 System.out.println("请假时间太长啦,不可以哟。。。");
			}
		}
	}
}

客户端测试代码Client-Main
package com.responsibility;

public class Main {
    public static void main(String[] args) {
	LeaderHandler a = new ConcreteHeadTeacherHandler("班主任:小红");
	LeaderHandler b = new ConcreteDirectorHandler("学办负责人:小绿");
	LeaderHandler b2 = new ConcreteClerkHandler("学院书记:小紫");

	a.setNextLeader(b);
	b.setNextLeader(b2);
	
	Request request = new Request("小明", 15, "请假回家!");
	a.handleRequest(request);
}

运行结果展示:

在这里插入图片描述

好了,到这里【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】就结束了,23种设计模式持续更新汇总中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值