【设计模式-职责链】

定义

职责链模式是一种行为设计模式,**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样,可以将处理请求的责任链式组织,从而实现更灵活的请求处理机制。

UML图

角色

  • Handler(处理者接口):定义处理请求的方法,并声明一个指向下一个处理者的引用。
  • ConcreteHandler(具体处理者):实现处理者接口,具体处理请求的逻辑。每个具体处理者可以决定是否处理请求,或将其传递给下一个处理者。
  • Client(客户端):发送请求的对象。客户端通常只需要知道请求的起始处理者,而不需要关心具体的处理链。

工作流程

  1. 客户端创建一个请求,并指定链中的第一个处理者。
  2. 第一个处理者接收到请求后,根据自己的处理逻辑决定是处理请求还是将请求传递给下一个处理者。
  3. 如果处理者处理请求,则返回结果;如果不处理,则继续将请求传递给链中的下一个处理者,直到请求被处理或到达链的末尾。

代码

java 复制代码
// Handler interface
abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(int request);
}

// ConcreteHandler1
class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("Handler1 handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// ConcreteHandler2
class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("Handler2 handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// ConcreteHandler3
class ConcreteHandler3 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20) {
            System.out.println("Handler3 handled request: " + request);
        }
    }
}

// Client code
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();

        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);

        // Test requests
        handler1.handleRequest(5);   // Handled by Handler1
        handler1.handleRequest(15);  // Handled by Handler2
        handler1.handleRequest(25);  // Handled by Handler3
    }
}

优点

  • 降低耦合性:请求发送者与处理者之间的关系松散,可以独立地添加、删除或更改处理者。
  • 动态添加或更改处理者:可以在运行时动态地改变请求处理链。
  • 简化代码:请求处理的逻辑分散到多个处理者中,使得代码更简洁、可读性更高。

缺点

  • 调试困难:由于请求在多个处理者之间传递,可能导致调试和追踪请求流变得复杂。
  • 可能的性能问题:如果链过长,可能导致处理请求的时间较长。

场景

  • 当多个对象可以处理同一个请求,但不知道具体哪个对象会处理时。
  • 当需要动态处理请求时,例如在GUI事件处理、日志处理等场景中。
  • 当请求处理的责任可以通过链式结构灵活组织时。
相关推荐
charlie1145141916 分钟前
精读C++20设计模式——行为型设计模式:命令模式
c++·学习·设计模式·程序设计·命令模式·c++20
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 59: 字母大小写全排列、优美的排列
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
workflower1 小时前
将图片中的图形转换为可编辑的 PPT 图形
java·开发语言·tomcat·powerpoint·个人开发·结对编程
卡戎-caryon2 小时前
【Java SE】06. 数组
java·开发语言
想躺平的咸鱼干2 小时前
Spring AI Alibaba
java·人工智能·spring
星空寻流年3 小时前
设计模式第六章(观察者模式)
网络·观察者模式·设计模式
老华带你飞3 小时前
学生信息管理系统|基于Springboot的学生信息管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·学生信息管理系统
聪明的笨猪猪3 小时前
Java SE “泛型 + 注解 + 反射”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
磨十三3 小时前
C++ 类型转换全面解析:从 C 风格到 C++ 风格
java·c语言·c++
Miqiuha3 小时前
设计模式之策略模式学习
学习·设计模式·策略模式