Java: Chain of Responsibility Pattern

项目结构:

java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:  行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:18
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : AppSettings.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.configuration;
 
/**
 * 全局配置根实体,对标C# AppSettings.cs
 * 映射appsettings.json配置节点
 */
public class AppSettings {
    /** 应用配置节点 */
    private AppNode App;
 
    public AppNode getApp() {
        return App;
    }
 
    public void setApp(AppNode app) {
        App = app;
    }
 
    /** 应用子节点配置 */
    public static class AppNode {
        /** 服务名称 */
        private String ServiceName;
        /** 日志根目录 */
        private String LogBasePath;
        /** 日志保留天数 */
        private int LogRetentionDay;
        /** OpenTelemetry链路追踪配置 */
        private OpenTelemetryConfig OpenTelemetry;
 
        public String getServiceName() {
            return ServiceName;
        }
 
        public void setServiceName(String serviceName) {
            ServiceName = serviceName;
        }
 
        public String getLogBasePath() {
            return LogBasePath;
        }
 
        public void setLogBasePath(String logBasePath) {
            LogBasePath = logBasePath;
        }
 
        public int getLogRetentionDay() {
            return LogRetentionDay;
        }
 
        public void setLogRetentionDay(int logRetentionDay) {
            LogRetentionDay = logRetentionDay;
        }
 
        public OpenTelemetryConfig getOpenTelemetry() {
            return OpenTelemetry;
        }
 
        public void setOpenTelemetry(OpenTelemetryConfig openTelemetry) {
            OpenTelemetry = openTelemetry;
        }
    }
 
    /** OpenTelemetry 链路追踪配置 */
    public static class OpenTelemetryConfig {
        /** 服务名称 */
        private String ServiceName;
        /** OTLP Collector地址 */
        private String OtlpEndpoint;
        /** 是否启用OTLP导出 */
        private boolean EnableOtlpExporter;
 
        public String getServiceName() {
            return ServiceName;
        }
 
        public void setServiceName(String serviceName) {
            ServiceName = serviceName;
        }
 
        public String getOtlpEndpoint() {
            return OtlpEndpoint;
        }
 
        public void setOtlpEndpoint(String otlpEndpoint) {
            OtlpEndpoint = otlpEndpoint;
        }
 
        public boolean isEnableOtlpExporter() {
            return EnableOtlpExporter;
        }
 
        public void setEnableOtlpExporter(boolean enableOtlpExporter) {
            EnableOtlpExporter = enableOtlpExporter;
        }
    }
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:  行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:19
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : AppSettingsBinderExtension.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.configuration;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
import java.io.File;
 
/**
 * JSON配置绑定扩展类,对标C# AppSettingsBinderExtension.cs
 * 读取本地json文件,自动映射到实体类
 */
public class AppSettingsBinderExtension {
    /**
     * 将json文件绑定为配置实体
     * @param jsonFile json配置文件
     * @param clazz 目标实体Class
     * @return 填充后的配置对象
     */
    public static <T> T Bind(File jsonFile, Class<T> clazz) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(jsonFile, clazz);
        } catch (Exception e) {
            throw new RuntimeException("读取appsettings.json配置失败", e);
        }
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:48
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ServiceCollectionExtensions.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.extensions;
 
import ChainofResponsibility.scheduler.IProcessScheduler;
import ChainofResponsibility.scheduler.JewelryProcessScheduler;
 
/**
 * 服务注册扩展类,对标C# ServiceCollectionExtensions.cs
 * 提供静态工厂方法创建所有业务服务(替代Spring容器)
 */
public class ServiceCollectionExtensions {
     
    /**
     * 创建调度器实例
     * @return IProcessScheduler实例
     */
    public static IProcessScheduler createScheduler() {
        return new JewelryProcessScheduler();
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:19
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : CustomConsoleFormatter.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.logging;
 
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.LayoutBase;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
 
/**
 * 自定义控制台日志格式化器,对标C# CustomConsoleFormatter.cs
 * 使用Layout方式实现,兼容Logback 1.4.x版本
 */
public class CustomConsoleFormatter extends LayoutBase<ILoggingEvent> {
    private static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
                    .withZone(ZoneId.systemDefault());
 
    @Override
    public String doLayout(ILoggingEvent event) {
        String timestamp = FORMATTER.format(Instant.ofEpochMilli(event.getTimeStamp()));
        return String.format("[%s] [%s] %s - %s%n",
                timestamp,
                event.getLevel(),
                event.getLoggerName(),
                event.getFormattedMessage());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:20
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : FileLoggerCustomFormatter.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.logging;
 
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.LayoutBase;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
 
/**
 * 文件日志自定义格式化器,对标C# FileLoggerCustomFormatter.cs
 * 使用Layout方式实现,兼容Logback 1.4.x版本
 */
public class FileLoggerCustomFormatter extends LayoutBase<ILoggingEvent> {
    private static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
                    .withZone(ZoneId.systemDefault());
 
    @Override
    public String doLayout(ILoggingEvent event) {
        String timestamp = FORMATTER.format(Instant.ofEpochMilli(event.getTimeStamp()));
        return String.format("[%s] [%s] %s | %s%n",
                timestamp,
                event.getLevel(),
                event.getLoggerName(),
                event.getFormattedMessage());
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:20
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LoggingBuilderExtensions.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.logging;
 
import ChainofResponsibility.configuration.AppSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * 日志配置扩展方法,对标C# LoggingBuilderExtensions.cs
 */
public class LoggingBuilderExtensions {
    private static final Logger log = LoggerFactory.getLogger(LoggingBuilderExtensions.class);
 
    /**
     * 初始化全局日志配置
     * @param settings 应用配置
     */
    public static void ConfigureLogging(AppSettings settings) {
        log.info("加载日志配置,日志目录:{}", settings.getApp().getLogBasePath());
        // 实际格式化绑定逻辑由logback.xml完成,此处预留扩展入口
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:47
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IProcessScheduler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.scheduler;
 
import ChainofResponsibility.chain.abstractions.IBusinessHandler;
 
/**
 * 流程调度器接口,对标C# IProcessScheduler.cs
 * 负责组装责任链、启动业务流程
 */
public interface IProcessScheduler {
    /**
     * 组装完整责任链
     * @return 链路入口Handler
     */
    IBusinessHandler buildCompleteChain();
 
    /**
     * 执行正常完整业务流程
     */
    void runFullNormalProcess();
 
    /**
     * 执行测试失败流程(模拟原料缺失)
     */
    void runFailedPurchaseTestProcess();
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:47
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelryProcessScheduler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.scheduler;
 
import ChainofResponsibility.chain.abstractions.IBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
import ChainofResponsibility.chain.handlers.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * 业务流程调度实现类,对标C# JewelryProcessScheduler.cs
 * 组装完整责任链,提供测试入口
 */
public class JewelryProcessScheduler implements IProcessScheduler {
    private static final Logger log = LoggerFactory.getLogger(JewelryProcessScheduler.class);
 
    private final MaterialPurchaseHandler materialPurchaseHandler;
    private final DesignDrawHandler designDrawHandler;
    private final ProduceHandler produceHandler;
    private final QualityCheckHandler qualityCheckHandler;
    private final PackageHandler packageHandler;
    private final LogisticsHandler logisticsHandler;
    private final FinanceHandler financeHandler;
    private final MarketingHandler marketingHandler;
    private final BusinessHandler businessHandler;
    private final HrAdminHandler hrAdminHandler;
    private final ItHandler itHandler;
    private final TrainingHandler trainingHandler;
 
    public JewelryProcessScheduler() {
        // 手动创建所有Handler(替代Spring依赖注入)
        this.materialPurchaseHandler = new MaterialPurchaseHandler();
        this.designDrawHandler = new DesignDrawHandler();
        this.produceHandler = new ProduceHandler();
        this.qualityCheckHandler = new QualityCheckHandler();
        this.packageHandler = new PackageHandler();
        this.logisticsHandler = new LogisticsHandler();
        this.financeHandler = new FinanceHandler();
        this.marketingHandler = new MarketingHandler();
        this.businessHandler = new BusinessHandler();
        this.hrAdminHandler = new HrAdminHandler();
        this.itHandler = new ItHandler();
        this.trainingHandler = new TrainingHandler();
    }
 
    /**
     * 按顺序组装整条责任链
     */
    @Override
    public IBusinessHandler buildCompleteChain() {
        return materialPurchaseHandler
                .SetNext(designDrawHandler)
                .SetNext(produceHandler)
                .SetNext(qualityCheckHandler)
                .SetNext(packageHandler)
                .SetNext(logisticsHandler)
                .SetNext(financeHandler)
                .SetNext(marketingHandler)
                .SetNext(businessHandler)
                .SetNext(hrAdminHandler)
                .SetNext(itHandler)
                .SetNext(trainingHandler);
    }
 
    /**
     * 正常完整流程测试:参数齐全
     */
    @Override
    public void runFullNormalProcess() {
        log.info("========== 启动正常珠宝新品完整业务流程 ==========");
        JewelryBusinessContext ctx = new JewelryBusinessContext();
        ctx.setBusinessNo("BUS20260729001");
        ctx.setJewelryName("古法黄金手镯");
        ctx.setMaterial("足金999");
        ctx.setPass(true);
 
        IBusinessHandler entry = buildCompleteChain();
        entry.HandleAsync(ctx).join();
 
        log.info("流程执行结束,最终状态:isPass={},备注:{}", ctx.isPass(), ctx.getRemark());
    }
 
    /**
     * 失败测试流程:材质为空,第一环节直接拦截
     */
    @Override
    public void runFailedPurchaseTestProcess() {
        log.info("========== 启动失败测试流程(材质缺失) ==========");
        JewelryBusinessContext ctx = new JewelryBusinessContext();
        ctx.setBusinessNo("BUS20260729002");
        ctx.setJewelryName("钻石戒指");
        ctx.setMaterial("");
        ctx.setPass(true);
 
        IBusinessHandler entry = buildCompleteChain();
        entry.HandleAsync(ctx).join();
 
        log.info("流程执行结束,最终状态:isPass={},备注:{}", ctx.isPass(), ctx.getRemark());
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:21
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : OpenTelemetryBuilderExtensions.java
 * explain   : 学习  类
 * https://repo1.maven.org/maven2/io/opentelemetry/
 *
 **/
 
package ChainofResponsibility.tracing;
 
import ChainofResponsibility.configuration.AppSettings;
import io.opentelemetry.api.OpenTelemetry;
 
/**
 * OpenTelemetry装配扩展,对标C# OpenTelemetryBuilderExtensions.cs
 * 由于OpenTelemetry SDK依赖版本不完整,返回noop实现
 */
public class OpenTelemetryBuilderExtensions {
 
    /**
     * 初始化OpenTelemetry追踪
     * @param settings 全局配置
     * @return OpenTelemetry实例
     */
    public static OpenTelemetry BuildOpenTelemetry(AppSettings settings) {
        // 简化实现:直接返回noop,因为OpenTelemetry SDK 1.9.1依赖不完整
        // 如需完整功能,需要添加opentelemetry-sdk-extension-autoconfigure等依赖
        return OpenTelemetry.noop();
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:21
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : TraceConstants.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.tracing;
 
/**
 * 链路追踪常量定义,对标C# TraceConstants.cs
 */
public class TraceConstants {
    /** 全局追踪Source名称,所有Span归属此名称 */
    public static final String ActivitySourceName = "JewelryChainBusinessTrace";
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:48
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogCleanBackgroundService.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.backgroundservices;
 
import ChainofResponsibility.configuration.AppSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.File;
import java.time.Duration;
import java.time.Instant;
 
/**
 * 日志清理后台任务,对标C# LogCleanBackgroundService.cs
 * 定时删除超过保留天数的旧日志文件
 */
public class LogCleanBackgroundService implements Runnable {
    private static final Logger log = LoggerFactory.getLogger(LogCleanBackgroundService.class);
    private final AppSettings settings;
 
    public LogCleanBackgroundService(AppSettings settings) {
        this.settings = settings;
    }
 
    @Override
    public void run() {
        try {
            log.info("开始执行过期日志清理任务");
            String logPath = settings.getApp().getLogBasePath();
            File logRoot = new File(logPath);
            if (!logRoot.exists()) {
                log.warn("日志目录不存在:{}", logPath);
                return;
            }
 
            int keepDay = settings.getApp().getLogRetentionDay();
            long expireMs = Duration.ofDays(keepDay).toMillis();
            Instant now = Instant.now();
 
            scanDirectory(logRoot, now, expireMs);
            log.info("日志清理任务执行完成");
        } catch (Exception ex) {
            log.error("日志清理任务异常", ex);
        }
    }
 
    /**
     * 递归扫描目录,删除过期文件
     * @param folder 当前文件夹
     * @param now 当前时间
     * @param expireMs 过期毫秒阈值
     */
    private void scanDirectory(File folder, Instant now, long expireMs) {
        File[] files = folder.listFiles();
        if (files == null) return;
        for (File file : files) {
            if (file.isDirectory()) {
                scanDirectory(file, now, expireMs);
                continue;
            }
            Instant fileTime = Instant.ofEpochMilli(file.lastModified());
            if (Duration.between(fileTime, now).toMillis() > expireMs) {
                boolean del = file.delete();
                if (del) {
                    log.info("删除过期日志文件:{}", file.getAbsolutePath());
                }
            }
        }
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:39
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BaseBusinessHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.abstractions;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
 
/**
 * 处理器抽象基类,对标C# BaseBusinessHandler<T>
 * 封装通用链路流转逻辑,子类只需要实现ProcessAsync核心业务
 */
public abstract class BaseBusinessHandler implements IBusinessHandler {
    /** 当前处理器日志对象 */
    protected final Logger logger;
    /** 下一个处理器 */
    private IBusinessHandler nextHandler;
 
    protected BaseBusinessHandler() {
        this.logger = LoggerFactory.getLogger(this.getClass());
    }
 
    /**
     * 子类实现:当前环节核心业务逻辑
     * @param context 业务上下文
     * @return 执行Future
     */
    protected abstract CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context);
 
    /**
     * 统一入口:执行当前逻辑,判断是否流转到下一环节
     */
    @Override
    public CompletableFuture<Void> HandleAsync(JewelryBusinessContext context) {
        return ProcessAsync(context)
                .thenCompose(unused -> {
                    // 校验失败,终止链路,不再执行后续Handler
                    if (!context.isPass() || nextHandler == null) {
                        return CompletableFuture.completedFuture(null);
                    }
                    // 流转下一环节
                    return nextHandler.HandleAsync(context);
                });
    }
 
    /**
     * 设置下一个处理器
     * @param nextHandler 下一环
     * @return this
     */
    @Override
    public IBusinessHandler SetNext(IBusinessHandler nextHandler) {
        this.nextHandler = nextHandler;
        return this;
    }
 
    /**
     * 模拟异步延时(对标C# Task.Delay)
     * @param ms 毫秒
     * @return CompletableFuture
     */
    protected CompletableFuture<Void> Delay(long ms) {
        return CompletableFuture.runAsync(() -> {
            try {
                TimeUnit.MILLISECONDS.sleep(ms);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:39
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : IBusinessHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.abstractions;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 责任链顶层处理器接口,对标C# IBusinessHandler
 */
public interface IBusinessHandler {
    /**
     * 异步执行业务处理
     * @param context 业务上下文
     * @return 执行完成Future
     */
    CompletableFuture<Void> HandleAsync(JewelryBusinessContext context);
 
    /**
     * 设置下一个处理器(构建链表结构)
     * @param nextHandler 下一环处理器
     * @return 当前处理器(链式调用)
     */
    IBusinessHandler SetNext(IBusinessHandler nextHandler);
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:39
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : JewelryBusinessContext.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.abstractions;
 
/**
 * 责任链上下文对象,整条链路共享业务数据
 * 对标C# JewelryBusinessContext.cs
 */
public class JewelryBusinessContext {
    /** 业务唯一单号 */
    private String businessNo;
    /** 首饰款式名称 */
    private String jewelryName;
    /** 首饰材质(足金999/18K金等) */
    private String material;
    /** 当前正在执行的业务步骤名称 */
    private String currentStep;
    /** 是否校验通过;false直接终止整条责任链 */
    private boolean isPass = true;
    /** 流程备注、异常描述信息 */
    private String remark = "";
 
    public String getBusinessNo() {
        return businessNo;
    }
 
    public void setBusinessNo(String businessNo) {
        this.businessNo = businessNo;
    }
 
    public String getJewelryName() {
        return jewelryName;
    }
 
    public void setJewelryName(String jewelryName) {
        this.jewelryName = jewelryName;
    }
 
    public String getMaterial() {
        return material;
    }
 
    public void setMaterial(String material) {
        this.material = material;
    }
 
    public String getCurrentStep() {
        return currentStep;
    }
 
    public void setCurrentStep(String currentStep) {
        this.currentStep = currentStep;
    }
 
    public boolean isPass() {
        return isPass;
    }
 
    public void setPass(boolean pass) {
        isPass = pass;
    }
 
    public String getRemark() {
        return remark;
    }
 
    public void setRemark(String remark) {
        this.remark = remark;
    }
 
    /**
     * 追加备注信息
     * @param msg 需要追加的文本
     */
    public void appendRemark(String msg) {
        this.remark = this.remark + msg;
    }
}
  
java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:45
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : BusinessHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节9:门店业务运营处理器
 */
public class BusinessHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("门店业务运营");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】库存分配下发、门店销售台账同步完成", context.getCurrentStep());
        return Delay(6);
    }
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:41
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : DesignDrawHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节2:款式设计绘图处理器
 */
public class DesignDrawHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("款式设计绘图");
        logger.info("【{}】开始处理,单号:{},款式:{}",
                context.getCurrentStep(), context.getBusinessNo(), context.getJewelryName());
 
        if (context.getJewelryName() == null || context.getJewelryName().isBlank()) {
            context.setPass(false);
            context.appendRemark("款式名称为空,无法开展设计绘图;");
            logger.warn("【{}】校验失败:款式名称缺失", context.getCurrentStep());
            return CompletableFuture.completedFuture(null);
        }
 
        logger.debug("【{}】3D建模、图纸渲染、工艺参数确认完成", context.getCurrentStep());
        return Delay(8);
    }
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:44
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : FinanceHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节7:财务对账结算处理器
 */
public class FinanceHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("财务对账结算");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】原料成本核算、销售单据对账、发票信息登记完成", context.getCurrentStep());
        return Delay(9);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:45
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : HrAdminHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节10:人事行政处理器
 */
public class HrAdminHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("人事行政统筹");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】生产/销售人员排班、绩效预登记完成", context.getCurrentStep());
        return Delay(3);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:46
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ItHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节11:信息系统运维处理器
 */
public class ItHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("信息系统运维");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】ERP单据同步、商品档案录入、数据归档完成", context.getCurrentStep());
        return Delay(4);
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:43
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : LogisticsHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节6:物流发货处理器
 */
public class LogisticsHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("物流发货配送");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】保价物流下单、运单生成、出库交接完成", context.getCurrentStep());
        return Delay(7);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:44
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MarketingHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节8:市场营销处理器
 */
public class MarketingHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("市场营销推广");
        logger.info("【{}】开始处理,单号:{},款式:{}",
                context.getCurrentStep(), context.getBusinessNo(), context.getJewelryName());
 
        logger.debug("【{}】新品素材上架、门店陈列方案、活动政策配置完成", context.getCurrentStep());
        return Delay(5);
    }
}
 
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:40
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : MaterialPurchaseHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节1:原料采购核验处理器
 */
public class MaterialPurchaseHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("原料采购核验");
        logger.info("【{}】开始处理,单号:{},材质:{}",
                context.getCurrentStep(), context.getBusinessNo(), context.getMaterial());
 
        // 校验材质不能为空
        if (context.getMaterial() == null || context.getMaterial().isBlank()) {
            context.setPass(false);
            context.appendRemark("原料材质信息为空,无法采购;");
            logger.warn("【{}】校验失败:材质缺失", context.getCurrentStep());
            return CompletableFuture.completedFuture(null);
        }
 
        logger.debug("【{}】原料采购入库、质检验收完成", context.getCurrentStep());
        return Delay(8);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:43
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : PackageHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节5:珠宝包装封装处理器
 */
public class PackageHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("珠宝包装封装");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        logger.debug("【{}】首饰入盒、防尘包装、防盗标签、礼品卡片封装完成", context.getCurrentStep());
        return Delay(4);
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:42
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ProduceHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节3:工厂生产加工处理器
 */
public class ProduceHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("工厂生产加工");
        logger.info("【{}】开始处理,单号:{},材质:{}",
                context.getCurrentStep(), context.getBusinessNo(), context.getMaterial());
 
        logger.debug("【{}】开料、执模、镶嵌、抛光工序执行完毕", context.getCurrentStep());
        return Delay(12);
    }
}
 
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:42
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : QualityCheckHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.Random;
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节4:成品质检处理器
 */
public class QualityCheckHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("成品质量检测");
        logger.info("【{}】开始处理,单号:{}",
                context.getCurrentStep(), context.getBusinessNo());
 
        Random rand = new Random();
        int randomResult = rand.nextInt(1, 101);
        // 5%概率质检失败
        if (randomResult <= 5) {
            context.setPass(false);
            context.appendRemark(String.format("成品抽检不达标,随机质检编号%d;", randomResult));
            logger.warn("【{}】质检不通过,需要返厂重修", context.getCurrentStep());
            return CompletableFuture.completedFuture(null);
        }
 
        logger.debug("【{}】尺寸、成色、钻石牢固度检测全部合格,出具质检证书", context.getCurrentStep());
        return Delay(6);
    }
}
 
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/29 - 23:46
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : TrainingHandler.java
 * explain   : 学习  类
 **/
 
package ChainofResponsibility.chain.handlers;
 
import ChainofResponsibility.chain.abstractions.BaseBusinessHandler;
import ChainofResponsibility.chain.abstractions.JewelryBusinessContext;
 
import java.util.concurrent.CompletableFuture;
 
/**
 * 环节12:员工培训处理器(整条链路最后一环)
 */
public class TrainingHandler extends BaseBusinessHandler {
    @Override
    protected CompletableFuture<Void> ProcessAsync(JewelryBusinessContext context) {
        context.setCurrentStep("新品员工培训");
        logger.info("【{}】开始处理,单号:{},款式:{}",
                context.getCurrentStep(), context.getBusinessNo(), context.getJewelryName());
 
        logger.debug("【{}】产品卖点资料下发、导购培训计划创建完成;整条业务流程抵达末端", context.getCurrentStep());
        return Delay(2);
    }
}

调用:

java 复制代码
/**
 * encoding: utf-8
 * 版权所有 2026 ©涂聚文有限公司 ®
 * 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
 * 描述:行为模式 Behavioral Patterns  责任链模式 Chain of Responsibility Pattern
 * Author    : geovindu,Geovin Du 涂聚文.
 * IDE       : IntelliJ IDEA 2024.3.6 Java 17
 * # database  : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
 * # OS        : window10
 * Datetime  : 2026 - 2026/7/5 - 11:05
 * User      : geovindu
 * Product   : IntelliJ IDEA
 * Project   : javadesginpattern
 * File      : ChainOfResponsibilityBll.java
 * explain   : 学习  类
 **/
 
package BLL;
 
import ChainofResponsibility.backgroundservices.LogCleanBackgroundService;
import ChainofResponsibility.configuration.AppSettings;
import ChainofResponsibility.configuration.AppSettingsBinderExtension;
import ChainofResponsibility.extensions.ServiceCollectionExtensions;
import ChainofResponsibility.scheduler.IProcessScheduler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.File;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
 
public class ChainOfResponsibilityBll {
 
    /** 日志实例 */
    private static final Logger log = LoggerFactory.getLogger(ChainOfResponsibilityBll.class);
     
    private AppSettings appSettings;
    private IProcessScheduler scheduler;
    private ScheduledExecutorService executor;
 
    /**
     * 启动日志清理后台服务
     */
    private void startBackgroundLogCleanService() {
        LogCleanBackgroundService logCleanService = new LogCleanBackgroundService(appSettings);
        executor = Executors.newSingleThreadScheduledExecutor();
        // 每隔24小时执行一次日志清理
        executor.scheduleAtFixedRate(logCleanService, 0, 24, TimeUnit.HOURS);
        log.info("日志清理后台服务已启动");
    }
 
    /**
     * 初始化应用
     */
    private void initialize() {
        log.info("========== 珠宝业务责任链服务启动 ==========");
 
        // 1. 加载配置文件 appsettings.json
        File configFile = new File("appsettings.json");
        if (configFile.exists()) {
            appSettings = AppSettingsBinderExtension.Bind(configFile, AppSettings.class);
        } else {
            // 使用默认配置
            appSettings = createDefaultSettings();
            log.warn("配置文件appsettings.json不存在,使用默认配置");
        }
 
        // 2. 创建调度器(替代Spring容器)
        scheduler = ServiceCollectionExtensions.createScheduler();
 
        // 3. 启动后台定时服务:日志清理任务
        startBackgroundLogCleanService();
    }
     
    /**
     * 创建默认配置
     */
    private AppSettings createDefaultSettings() {
        AppSettings settings = new AppSettings();
        AppSettings.AppNode appNode = new AppSettings.AppNode();
        appNode.setServiceName("JewelryBusinessService");
        appNode.setLogBasePath("logs");
        appNode.setLogRetentionDay(30);
         
        AppSettings.OpenTelemetryConfig otelConfig = new AppSettings.OpenTelemetryConfig();
        otelConfig.setEnableOtlpExporter(false);
        appNode.setOpenTelemetry(otelConfig);
         
        settings.setApp(appNode);
        return settings;
    }
     
    /**
     * 关闭应用
     */
    public void shutdown() {
        if (executor != null && !executor.isShutdown()) {
            executor.shutdown();
            log.info("日志清理后台服务已停止");
        }
    }
 
    public void demo(){
        // 初始化
        initialize();
         
        // 4. 执行完整责任链测试
        // 正常业务流程测试
        log.info("\n========== 执行正常业务流程测试 ==========");
        scheduler.runFullNormalProcess();
         
        // 模拟失败流程测试(原料参数缺失)
        log.info("\n========== 执行失败流程测试(原料缺失) ==========");
        scheduler.runFailedPurchaseTestProcess();
 
        log.info("\n业务执行完成");
         
        // 保持后台服务运行一段时间演示
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
         
        shutdown();
    }
}

输出:

相关推荐
神经蛙199615 小时前
🌍 别再硬编码中文了!Python Web 项目国际化(i18n)完全指南
后端·python
二月龙15 小时前
Spring 事务失效的 8 种场景,很多老手依然频繁踩雷
后端
掘金酱15 小时前
「TRAE Work 实战帮」征文启动!你沉淀的经验,值得被看见!
前端·人工智能·后端
长大198815 小时前
MyBatis 常见性能陷阱:N+1 查询、一级缓存踩坑解决方案
后端
用户18615580086015 小时前
MinIO Java 对接试用:从连接、上传到下载的完整示例
后端
爱勇宝15 小时前
DeepSeek V4-Flash 更新:代码与 Agent 能力全面增强
前端·后端·deepseek
春生野草15 小时前
个人笔记——C语言字符串、树
c语言·开发语言·笔记
极客悟道15 小时前
SDKMAN vs jEnv vs JetTUI,JDK 版本管理到底选哪个
后端
长大198815 小时前
Java8 新特性到底要不要吃透?工作中高频使用的 5 个功能总结
后端