笨蛋学设计模式行为型模式-责任链模式【18】

2024-01-23 07:12

本文主要是介绍笨蛋学设计模式行为型模式-责任链模式【18】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

行为型模式-责任链模式

    • 8.5责任链模式:arrow_up::arrow_up::arrow_up:
      • 8.5.1概念
      • 8.5.2场景
      • 8.5.3优势 / 劣势
      • 8.5.4责任链模式可分为
      • 8.5.5责任链模式
      • 8.5.6实战
        • 8.5.6.1题目描述
        • 8.5.6.2输入描述
        • 8.5.6.3输出描述
        • 8.5.6.4代码
      • 8.5.7总结

8.5责任链模式⬆️⬆️⬆️

8.5.1概念

​ 责任链模式定义了一系列的处理器对象,每个处理器对象都包含对链表中下一个处理器对象的引用。在这条请求链条中,每当一个请求发生时,它就会被传递给链表的下一个处理器对象,直到某个处理器对象处理该请求为止。

8.5.2场景

​ 在我们公司内部审批流程中,若某个员工提交了请假申请,需要经过上级的一系列的审批过程,例如小组长审批、部门经理审批、人事部审批、总经理审批等。这些审批过程可以采用责任链模式来实现,将每个审批者看作一个处理器,若某个处理者无法处理该申请,则将该申请传递给下一个处理者,直到有一个处理者同意或拒绝该申请为止。

8.5.3优势 / 劣势

  • 降低耦合度:请求发送者和接收者之间不直接交互,而是通过责任链上的多个对象进行交互,从而降低了它们之间的耦合度
  • 增强灵活性:可以动态地增加或删除处理器,从而改变请求的处理顺序和方式
  • 提高可扩展性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型

  • 请求未处理:若没有任何一个处理器能够处理该请求,则该请求将被忽略
  • 系统性能降低:由于责任链中可能包含大量的处理器,因此可能会影响系统的性能

8.5.4责任链模式可分为

  • 处理者Handler:定义一个处理请求的接口,包含一个处理请求的抽象方法和指向下一个处理者的链接
  • 具体处理者ConcreteHandler:实现处理请求的方法,并判断能否处理请求,若能够处理请求则进行处理,否则将请求传递给下一个处理者
  • 客户端:创建并组装处理者对象链,并将请求发送到链上的第一个处理者

8.5.5责任链模式

package com.technologystatck.designpattern.mode.chainofresponsibility;public class ChainOfResponsibility {public static void main(String[] args) {//创建处理者实例ConcreteHandler handlerA = new ConcreteHandler();ConcreteHandler handlerB = new ConcreteHandler();//...可以继续创建其他处理者实例//构建责任链handlerA.setNextHandler(handlerB);//...可以继续构建责任链//发送请求Request request = new Request(/*请求参数*/);handlerA.handleRequest(request);}
}//1.处理者:定义处理请求的接口
interface Handler{//处理请求的方法void handleRequest(Request request);//设置下一个处理者的方法void setNextHandler(Handler nextHandler);
}//2.具体处理者:实现处理请求
class ConcreteHandler implements Handler{private Handler nextHandler;//具体处理者自己的判断条件private boolean canHandle(Request request){//根据具体情况判断是否能够处理请求/*** 放入自己的判断条件*/return true;}@Overridepublic void handleRequest(Request request) {//根据具体情况处理请求,若无法处理则转发给下一个处理者if(canHandle(request)){//处理请求的逻辑}else if(nextHandler !=null){nextHandler.handleRequest(request);}else{//无法处理请求的逻辑,如打印日志等等}}@Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler=nextHandler;}
}

8.5.6实战

8.5.6.1题目描述

小明所在的公司请假需要在OA系统上发布申请,整个请求流程包括多个处理者,每个处理者负责处理不同范围的请假天数,如果一个处理者不能处理请求,就会将请求传递给下一个处理者,请你实现责任链模式,可以根据请求天数找到对应的处理者。

审批责任链由主管(Supervisor), 经理(Manager)和董事(Director)组成,他们分别能够处理3天、7天和10天的请假天数。如果超过10天,则进行否决。

8.5.6.2输入描述

第一行是一个整数N(1 <= N <= 100), 表示请求申请的数量。

接下来的N行,每行包括一个请求申请的信息,格式为"姓名 请假天数"

8.5.6.3输出描述

对于每个请假请求,输出一行,表示该请求是否被批准。如果被批准/否决,输出被哪一个职级的人批准/否决。

8.5.6.4代码
package com.technologystatck.designpattern.mode.chainofresponsibility;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int nums=scanner.nextInt();scanner.nextLine();//组织责任链LeaveHandler director = new Director();LeaveHandler manager = new Manager(director);LeaveHandler supervisor = new Supervisor(manager);for(int i=0;i<nums;i++){String[] input = scanner.nextLine().split(" ");if(input.length==2){String name=input[0];int days=Integer.parseInt(input[1]);LeaveRequest request = new LeaveRequest(name, days);supervisor.handleRequest(request);}else{System.out.println("Invalid input");return;}}}
}//请求类
class LeaveRequest{private String name;private int days;public LeaveRequest(String name, int days) {this.name = name;this.days = days;}public String getName() {return name;}public int getDays() {return days;}
}
//处理者:定义接口
interface LeaveHandler{void handleRequest(LeaveRequest request);
}//具体处理者:可以有多个,负责具体处理,主要分为Supervisor、Manager、Director
//主管类
class Supervisor implements LeaveHandler{//最多3天请假审批private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=3;//设置下一个处理器对象private LeaveHandler nextHandler;public Supervisor(LeaveHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(LeaveRequest request) {//若请假的天数小于当前处理者所能审批的最大天数,则直接审批通过,否则继续传递给下一个处理者。if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){System.out.println(request.getName()+" Approved by Supervisor.");}else if(nextHandler !=null){//若下一个处理器不为空,就直接传给下一个处理器nextHandler.handleRequest(request);}else{System.out.println(request.getName()+"Denied by Supervisor.");}}
}
//经理类
class Manager implements LeaveHandler{//最多7天请假审批private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=7;//设置下一个处理器对象private LeaveHandler nextHandler;public Manager(LeaveHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(LeaveRequest request) {if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){System.out.println(request.getName()+" Approved by Manager.");}else if(nextHandler !=null){nextHandler.handleRequest(request);}else{System.out.println(request.getName()+" Denied by Manager.");}}
}//总监类
class Director implements LeaveHandler{private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=10;@Overridepublic void handleRequest(LeaveRequest request) {if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){System.out.println(request.getName()+" Approved by Director.");}else{System.out.println(request.getName()+" Denied by Director.");}}
}

8.5.7总结

  • 优点:每个处理者只负责处理与自己相关的请求,客户端不需要具体时哪个处理者处理请求
  • 总结:类似过滤器中的链式处理,一个请求不断地在链式中传入下一个处理者,直到有一个处理者能处理该请求
  • 场景:适用于一个请求会被多个处理者进行处理,并且整条责任链模式中会有合适的处理者来处理请求

这篇关于笨蛋学设计模式行为型模式-责任链模式【18】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635608

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统