设计模式——责任链模式

这篇具有很好参考价值的文章主要介绍了设计模式——责任链模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

责任链模式

定义

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

优缺点

优点

能将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦提高系统的灵活性

缺点

  1. 性能问题,每个请求都是从链头遍历到链尾,尤其是链较长的时候,会有性能方面的影响。
  2. 调试不方便,由于采用了类似递归的方式(本实验用的是队列的遍历),调试的时候会比较复杂。

实验小结

  1. 即一个任务到来时,进入责任链,从头开始遍历责任人,不是则依次往下寻找,直到找到负责该任务的责任人(可能无人负责)
  2. 将责任链节点依次加入队列就能build()出责任链关系。

代码模拟场景

项目进入测试阶段,项目组出现问题,依次寻找测试、开发、产品经理寻求帮助。

责任链模式

UML图

设计模式——责任链模式,设计模式,设计模式,责任链模式,java

责任链节点抽象、实现类

public abstract class AbstractHandler {
	/**
	 * 测试处理等级
	 */
	public final static int TEST_LEVEL_REQUEST = 1;
	/**
	 * 开发处理等级
	 */
	public final static int DEVELOPER_LEVEL_REQUEST = 2;
	/**
	 * 产品经理处理等级
	 */
	public final static int PRODUCT_MANAGER_LEVEL_REQUEST = 3;
	/**
	 * 能处理的级别
	 */
	private final int level;
	/**
	 * 责任传递,下个责任人是谁
	 */
	private AbstractHandler nextHandler;

	/**
	 * 每个责任节点都要说明下自己能处理哪些需求
	 *
	 * @param level 处理等级
	 */
	public AbstractHandler(int level) {
		this.level = level;
	}

	/**
	 * 处理项目的要求
	 *
	 * @param project 项目需要
	 */
	public final void handleMessage(IProject project) {
		if (project.getType() == this.level) {
			this.response(project);
		} else {
			// 后续有环节则继续推进请求
			if (this.nextHandler != null) {
				this.nextHandler.handleMessage(project);
			} else {
				System.out.println("已无流程批示,不同意");
			}
		}
	}

	/**
	 * 传递给下个处理人
	 *
	 * @param handler 下个处理人
	 */
	public void setNext(AbstractHandler handler) {
		this.nextHandler = handler;
	}

	/**
	 * 处理人的回应
	 *
	 * @param project 项目对象
	 */
	protected abstract void response(IProject project);
}


/**
 * @author Evad.Wu
 * @Description 测试工程师
 * @date 2023-07-10
 */
public class TestEngineer extends AbstractHandler {
	/**
	 * 每个责任节点都要说明下自己能处理哪些需求
	 */
	public TestEngineer() {
		super(AbstractHandler.TEST_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("项目组向测试人员咨询");
		System.out.println(project.getRequest());
		System.out.println("测试人员的答复是:找我就对了");
	}
}

/**
 * @author Evad.Wu
 * @Description 开发工程师
 * @date 2023-07-10
 */
public class DevelopmentEngineer extends AbstractHandler {
	/**
	 * 每个责任节点都要说明下自己能处理哪些需求
	 */
	public DevelopmentEngineer() {
		super(AbstractHandler.DEVELOPER_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("项目组向开发人员咨询");
		System.out.println(project.getRequest());
		System.out.println("开发人员的答复是:找我就对了");
	}
}

/**
 * @author Evad.Wu
 * @Description 产品经理
 * @date 2023-07-10
 */
public class ProductManager extends AbstractHandler {
	/**
	 * 每个责任节点都要说明下自己能处理哪些需求
	 */
	public ProductManager() {
		super(AbstractHandler.PRODUCT_MANAGER_LEVEL_REQUEST);
	}

	@Override
	protected void response(IProject project) {
		System.out.println("项目组向产品经理咨询");
		System.out.println(project.getRequest());
		System.out.println("产品经理的答复是:找我就对了");
	}
}

项目组抽象、实现类

public interface IProject {
	/**
	 * 获取咨询问题的类型
	 *
	 * @return 类型编号
	 */
	int getType();

	/**
	 * 获取咨询的内容
	 *
	 * @return 咨询的内容
	 */
	String getRequest();
}

public class ProjectImpl implements IProject {
	/**
	 * 问题类型
	 * 1-测试处理 2-开发处理 3-产品处理
	 */
	private final int type;
	/**
	 * 本次处理的请求
	 */
	private String request;

	public ProjectImpl(int type, String request) {
		this.type = type;
		this.request = request;
		switch (this.type) {
			case 1 -> this.request += "测试方面的咨询";
			case 2 -> this.request += "开发方面的咨询";
			case 3 -> this.request += "产品方面的咨询";
			default -> this.request += "没有人对应的人员可以处理";
		}
	}

	/**
	 * 获取咨询问题的类型
	 *
	 * @return 类型编号
	 */
	public int getType() {
		return type;
	}

	/**
	 * 获取咨询的内容
	 *
	 * @return 咨询的内容
	 */
	public String getRequest() {
		return request;
	}
}

责任链

负责将节点串联起来

public class Chain<T extends AbstractHandler> {
	// 定义三个咨询对象
	private AbstractHandler peek;

	public Chain(Queue<T> sequence) {
		if (!sequence.isEmpty()) {
			T peek = sequence.peek();
			this.peek = peek;
			sequence.poll();
			for (T current : sequence) {
				peek.setNext(current);
				peek = current;
			}
		}
	}

	public AbstractHandler build() {
		return peek;
	}
}

入口类

public class ResponsibilityChainMain {
	public static void main(String[] args) {
		List<IProject> projectList = new ArrayList<>();
		projectList.add(new ProjectImpl(1, "项目出问题,需要人员支持..."));
		projectList.add(new ProjectImpl(2, "项目出问题,需要人员支持..."));
		projectList.add(new ProjectImpl(3, "项目出问题,需要人员支持..."));
		projectList.add(new ProjectImpl(4, "项目出问题,需要人员支持..."));

		Queue<AbstractHandler> sequence = new LinkedList<>();
		// 咨询的顺序是:测试、开发、产品经理
		sequence.add(new TestEngineer());
		sequence.add(new DevelopmentEngineer());
		sequence.add(new ProductManager());
		AbstractHandler handler = new Chain<>(sequence).build();
		for (IProject project : projectList) {
			handler.handleMessage(project);
			System.out.println();
		}
	}
}

结果

设计模式——责任链模式,设计模式,设计模式,责任链模式,java

参考书籍

秦小波《设计模式之禅》文章来源地址https://www.toymoban.com/news/detail-558015.html

到了这里,关于设计模式——责任链模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】Java 设计模式之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility) 一、概述 责任链模式是一种行为设计模式,它允许请求在对象链中传递。每个对象都有机会处理该请求,并且能将其传递给链中的下一个对象。这种模式为请求创建了一个处理对象的链,并沿着这条链传递该请求,直到有一个对象处理它为止

    2024年03月22日
    浏览(42)
  • 【玩转23种Java设计模式】行为型模式篇:责任链模式

    软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接:【玩转23种Java设计模式】学习目录汇总

    2024年02月13日
    浏览(34)
  • Java设计模式—责任链模式(Chin of Responsibility)

    目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图  1.定义一个请求枚举类  2.定义一个请求类 3.定义一个抽象处理接口 4、定

    2024年02月08日
    浏览(34)
  • Java设计模式-责任链(Chain of Responsibility)模式

    Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中的哪个对象处理,所以责任链模式可以方便组织责任链而不影响调用

    2024年02月16日
    浏览(45)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(56)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(40)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

    2024年02月15日
    浏览(39)
  • 【设计模式】责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处

    2024年02月12日
    浏览(38)
  • 设计模式——责任链模式

    使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止。 优点 能将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦提高系

    2024年02月15日
    浏览(40)
  • 设计模式—责任链模式

    一、待解决问题 : 减少代码中 if else 语句,降低代码圈复杂度或深度,增强可读性。 1、需求背景: 采购订单创建,需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题,都无法下单。 2、代码如下: 学习使用责任链模式后

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包