贯穿设计模式-责任链模式

news/2024/5/19 14:50:36 标签: 设计模式, 责任链模式

样例代码

涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取

需求

实时地,根据city,sex,product字段进行业务投放,比如:北京的男生;四川的电脑等等 → 责任链模式(责任链表模式)

UML图

<a class=责任链模式" />

handler自身含有next指针和链表类似,使用Apollo进行动态配置字段进行规则变更

Apollo访问不到内网地址

由于Apollo使用Docker进行安装,导致Apollo访问不到configserver的地址

app:
  id: DesignPatternLearning

# apollo
apollo:
  meta: "http://localhost:8080"
  bootstrap:
    enabled: true
    eagerLoad:
      enabled: true
  cacheDir:
    "/Users/hujiale/GitCode/Apoll"

logger:
  level:
    com:
      info

执行时在JVM参数添加-Dapollo.configService=http://localhost:8080即可解决

核心代码

在这里插入图片描述

//组装责任链条并返回责任链条首节点
private AbstractBusinessHandler buildChain() {

    //如果没有配置,直接返回null
    if (Objects.isNull(this.handlerType)) {
        return null;
    }

    if (Objects.isNull(this.currentHandlerType)) {
        this.currentHandlerType = this.handlerType;
    }

    if (this.currentHandlerType.equals(this.handlerType) && Objects.nonNull(this.currentHandler)) {
        return this.currentHandler;
    } else {
        log.info("config modified or first init, start to assemble duty chain.");
        synchronized (this) {
            try {
                //伪头节点
                AbstractBusinessHandler dummyHeadHandler = new CityHandler();
                AbstractBusinessHandler preHandler = dummyHeadHandler;

				//采用反射实例化责任链节点
                String[] handlerTypeList = this.handlerType.split(",");
                for (String handlerType : handlerTypeList) {
                    AbstractBusinessHandler handler = (AbstractBusinessHandler)
                            Class.forName(HandlerEnum.valueOf(handlerType).getValue()).newInstance();
                    preHandler.nextHandler = handler;
                    preHandler = handler;
                }
                
				// 初始化类中变量
                this.currentHandler = dummyHeadHandler.nextHandler;
                this.currentHandlerType = this.handlerType;

                return this.currentHandler;
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                throw new UnsupportedOperationException(e);
            }
        }
    }
}

http://www.niftyadmin.cn/n/5308497.html

相关文章

JRT表格元素完全体

之前分享的表格绘制是一个表格是实现雏形&#xff0c;周边把表格完全体实现&#xff0c;后面很多打印和绘制逻辑将借助此表格实现&#xff0c;所以需要表格够稳定够强大。 表格定义&#xff0c;后面借助模板设计器定义&#xff0c;现在是写死的测试定义对象。 1.PageList定义每…

听GPT 讲Rust源代码--compiler(25)

File: rust/compiler/rustc_target/src/spec/mod.rs 在Rust的源代码中&#xff0c;rust/compiler/rustc_target/src/spec/mod.rs文件的作用是定义和实现有关目标平台的规范。 SanitizerSet是一个结构体&#xff0c;用于表示目标平台上存在的sanitizer集合。 TargetWarnings是一…

【C语言】关闭socket需要包含的头文件

一、问题 linux系统&#xff0c;包含了头文件<sys/socket.h>&#xff0c; 警告 warning: implicit declaration of function ‘close’; did you mean ‘pclose’? [-Wimplicit-function-declaration] close(sockclient); ^~~~~ pclose 二、解决 在 Linux 系统下…

使用 Maven 的 dependencyManagement 管理项目依赖项

使用 Maven 的 dependencyManagement 管理项目依赖项 介绍 在开发 Java 项目时&#xff0c;管理和协调依赖项的版本号是一项重要而繁琐的任务。 而 Maven 提供了 <dependencyManagement> 元素&#xff0c;用于定义项目中所有依赖项的版本。它允许您指定项目中每个依赖…

Java并发编程的艺术:深度剖析锁的优化机制

目录 第一章&#xff1a;引言 第二章&#xff1a;锁的基础知识 2.1 synchronized关键字 2.2 ReentrantLock 第三章&#xff1a;锁的优化手段 3.1 自旋锁 3.2 可重入锁 3.3 读写锁 3.4 锁的粒度控制 3.5 CAS与乐观锁 第四章&#xff1a;锁的升级与降级 4.1 锁的升级 …

Ubuntun构建本地源详细教程

联网主机上下载软件包并打包 首先使用一台已连接互联网的同版本ubuntu主机添加国内镜像源 mv /etc/apt/sources.list /etc/apt/sources.list.bak vim /etc/apt/sources.list# 写入下面的内容: deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiv…

【深度学习:数据增强】计算机视觉中数据增强的完整指南

【深度学习&#xff1a;数据增强】计算机视觉中数据增强的完整指南 为什么要做数据增强&#xff1f;等等&#xff0c;什么是数据增强&#xff1f;数据增强技术数据增强的注意事项和潜在陷阱什么时候应该做数据增强&#xff1f;类不平衡的数据增强那么我应该选择哪些转换呢&…

使用 openpyxl 库读取 Excel 文件

使用 openpyxl 库来读取 Excel 文件中特定行和列的值: 通过 openpyxl.load_workbook() 函数加载 Excel 文件&#xff0c; 使用 worksheet.cell() 方法获取指定行和列的单元格&#xff0c;并返回其值 注&#xff1a;在运行代码之前确保已安装 openpyxl 库&#xff0c;并且输入…