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

简介: 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类图

image.png

实现代码

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

• 如果请假天数小于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);
}

运行结果展示:
image.png

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

相关文章
|
5月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
582 2
|
10月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
383 16
|
10月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
357 16
|
10月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
315 8
|
9月前
|
设计模式 算法 架构师
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
|
10月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
280 15
|
10月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
202 14
|
10月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
296 13
|
10月前
|
设计模式 Java 编译器
【设计模式】【行为型模式】解释器模式(Interpreter)
一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
228 11
|
10月前
|
设计模式 存储 JavaScript
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
260 11

热门文章

最新文章