码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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;
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    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);
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    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);
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    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("请假时间太长啦,不可以哟。。。");
    			}
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    客户端测试代码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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果展示:

    在这里插入图片描述

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

  • 相关阅读:
    宽带光纤接入网中影响家宽业务质量的常见原因有哪些
    【计算机网络】从输入URL到页面都显示经历了什么??
    使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
    docker for windows--安装jupyter运行环境
    ZOTERO入门小白教程【安装+插件】
    RTC 技术的试金石:火山引擎视频会议场景技术实践
    【论文阅读】Twin Neural Network Regression
    基于ssm的网上药房管理系统的设计与实现(源码+LW+调试)
    深度学习快速入门----Pytorch 系列1
    linux内核初始化成功后是如何过渡到android初始化的
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127547484
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号