码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 设计模式 - 责任链模式


    目录

    一. 前言

    二. 实现


    一. 前言

        责任链(Chain of Responsibility)模式的定义:也叫职责链模式。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

        在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

    二. 实现

    Handler: 定义处理请求的接口,并且实现后继链(successor)

    1. public abstract class Handler {
    2. protected Handler successor;
    3. public Handler(Handler successor) {
    4. this.successor = successor;
    5. }
    6. protected abstract void handleRequest(Request request);
    7. }
    1. public class ConcreteHandler1 extends Handler {
    2. public ConcreteHandler1(Handler successor) {
    3. super(successor);
    4. }
    5. @Override
    6. protected void handleRequest(Request request) {
    7. if (request.getType() == RequestType.type1) {
    8. System.out.println(request.getName() + " is handle by ConcreteHandler1");
    9. return;
    10. }
    11. if (successor != null) {
    12. successor.handleRequest(request);
    13. }
    14. }
    15. }
    1. public class ConcreteHandler2 extends Handler{
    2. public ConcreteHandler2(Handler successor) {
    3. super(successor);
    4. }
    5. @Override
    6. protected void handleRequest(Request request) {
    7. if (request.getType() == RequestType.type2) {
    8. System.out.println(request.getName() + " is handle by ConcreteHandler2");
    9. return;
    10. }
    11. if (successor != null) {
    12. successor.handleRequest(request);
    13. }
    14. }
    15. }
    1. public enum RequestType {
    2. type1, type2
    3. }
    4. public class Request {
    5. private RequestType type;
    6. private String name;
    7. public Request(RequestType type, String name) {
    8. this.type = type;
    9. this.name = name;
    10. }
    11. public RequestType getType() {
    12. return type;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. Handler handler1 = new ConcreteHandler1(null);
    4. Handler handler2 = new ConcreteHandler2(handler1);
    5. Request request1 = new Request(RequestType.type1, "request1");
    6. handler2.handleRequest(request1);
    7. Request request2 = new Request(RequestType.type2, "request2");
    8. handler2.handleRequest(request2);
    9. }
    10. }
    1. request1 is handle by ConcreteHandler1
    2. request2 is handle by ConcreteHandler2

    JDK中的实现
    java.util.logging.Logger#log()
    javax.servlet.Filter#doFilter()

  • 相关阅读:
    Springboot毕设项目基于Springboot的手机电商网站lmo47(java+VUE+Mybatis+Maven+Mysql)
    Aip接口自动化测试框架pytest+allure+request+jsonpath+excle
    .Net 对象生命周期由浅入深2(GC)
    mmdetection3d简单安装(官方教程就是坑)
    【Spring】20 解析Spring注解驱动的容器配置
    微擎模块 健身房小程序2.4.0 多用户版 微信官方获取用户信息接口调整, 做对应调整
    JAVA生成ORC格式文件
    实验四-----数据库
    第3 章 信息文档和配置管理
    自动化测试数据生成:Asp.Net Core单元测试利器AutoFixture详解
  • 原文地址:https://blog.csdn.net/mrluo735/article/details/133317861
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    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号