手搓责任链框架 4:链式构建

链式构建

概述

链式构建是责任链框架中的重要组成部分,它提供了一种优雅、灵活的方式来组装责任链。通过应用构建器模式,我们可以实现流式API,使得责任链的构建更加直观和易用。本章将详细介绍如何设计和实现链式构建器。

构建器模式应用

1. 构建器模式的优势

graph TD A[客户端代码] --> B[ChainBuilder] B --> C[添加处理器] C --> D[配置处理器] D --> E[构建责任链] E --> F[返回链头节点] G[传统方式] --> H[手动设置next] H --> I[容易出错] I --> J[代码冗长] B --> K[流式API] K --> L[类型安全] L --> M[易于维护]

构建器模式的优势:

  • 流式API:支持链式调用,代码更加简洁
  • 类型安全:编译时检查,减少运行时错误
  • 灵活配置:支持动态添加、删除、重排序处理器
  • 易于测试:可以轻松构建测试用的责任链

2. 基本构建器接口

java 复制代码
/**
 * 责任链构建器接口
 * 提供流式API来构建责任链
 */
public interface ChainBuilder<T, R> {
    
    /**
     * 添加处理器到链的末尾
     * @param handler 处理器实例
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> addHandler(Handler handler);
    
    /**
     * 添加处理器类型,由构建器负责实例化
     * @param handlerClass 处理器类
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> addHandler(Class<? extends Handler> handlerClass);
    
    /**
     * 在指定位置插入处理器
     * @param index 插入位置
     * @param handler 处理器实例
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> insertHandler(int index, Handler handler);
    
    /**
     * 移除指定的处理器
     * @param handler 要移除的处理器
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> removeHandler(Handler handler);
    
    /**
     * 移除指定位置的处理器
     * @param index 要移除的位置
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> removeHandler(int index);
    
    /**
     * 移除指定类型的所有处理器
     * @param handlerClass 处理器类型
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> removeHandlers(Class<? extends Handler> handlerClass);
    
    /**
     * 清空所有处理器
     * @return 构建器实例,支持链式调用
     */
    ChainBuilder<T, R> clear();
    
    /**
     * 构建责任链
     * @return 责任链的头节点
     */
    Handler build();
    
    /**
     * 获取当前链中的处理器数量
     * @return 处理器数量
     */
    int size();
    
    /**
     * 判断链是否为空
     * @return true表示为空,false表示不为空
     */
    boolean isEmpty();
}

链式API设计

1. 基础链式构建器实现

java 复制代码
/**
 * 默认的责任链构建器实现
 * @param <T> 请求类型
 * @param <R> 响应类型
 */
public class DefaultChainBuilder<T, R> implements ChainBuilder<T, R> {
    
    private final List<Handler> handlers;
    private final HandlerFactory handlerFactory;
    private static final Logger logger = LoggerFactory.getLogger(DefaultChainBuilder.class);
    
    public DefaultChainBuilder() {
        this.handlers = new ArrayList<>();
        this.handlerFactory = new DefaultHandlerFactory();
    }
    
    public DefaultChainBuilder(HandlerFactory handlerFactory) {
        this.handlers = new ArrayList<>();
        this.handlerFactory = handlerFactory;
    }
    
    @Override
    public ChainBuilder<T, R> addHandler(Handler handler) {
        if (handler == null) {
            throw new IllegalArgumentException("Handler cannot be null");
        }
        handlers.add(handler);
        logger.debug("Added handler: {}", handler.getClass().getSimpleName());
        return this;
    }
    
    @Override
    public ChainBuilder<T, R> addHandler(Class<? extends Handler> handlerClass) {
        if (handlerClass == null) {
            throw new IllegalArgumentException("Handler class cannot be null");
        }
        Handler handler = handlerFactory.createHandler(handlerClass);
        return addHandler(handler);
    }
    
    @Override
    public ChainBuilder<T, R> insertHandler(int index, Handler handler) {
        if (handler == null) {
            throw new IllegalArgumentException("Handler cannot be null");
        }
        if (index < 0 || index > handlers.size()) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + handlers.size());
        }
        handlers.add(index, handler);
        logger.debug("Inserted handler at index {}: {}", index, handler.getClass().getSimpleName());
        return this;
    }
    
    @Override
    public ChainBuilder<T, R> removeHandler(Handler handler) {
        if (handlers.remove(handler)) {
            logger.debug("Removed handler: {}", handler.getClass().getSimpleName());
        }
        return this;
    }
    
    @Override
    public ChainBuilder<T, R> removeHandler(int index) {
        if (index < 0 || index >= handlers.size()) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + handlers.size());
        }
        Handler removed = handlers.remove(index);
        logger.debug("Removed handler at index {}: {}", index, removed.getClass().getSimpleName());
        return this;
    }
    
    @Override
    public ChainBuilder<T, R> removeHandlers(Class<? extends Handler> handlerClass) {
        handlers.removeIf(handler -> handlerClass.isInstance(handler));
        logger.debug("Removed all handlers of type: {}", handlerClass.getSimpleName());
        return this;
    }
    
    @Override
    public ChainBuilder<T, R> clear() {
        handlers.clear();
        logger.debug("Cleared all handlers");
        return this;
    }
    
    @Override
    public Handler build() {
        if (handlers.isEmpty()) {
            logger.warn("Building empty chain");
            return new EmptyHandler();
        }
        
        // 链接所有处理器
        for (int i = 0; i < handlers.size() - 1; i++) {
            handlers.get(i).setNext(handlers.get(i + 1));
        }
        
        Handler head = handlers.get(0);
        logger.info("Built chain with {} handlers", handlers.size());
        return head;
    }
    
    @Override
    public int size() {
        return handlers.size();
    }
    
    @Override
    public boolean isEmpty() {
        return handlers.isEmpty();
    }
    
    /**
     * 获取处理器列表的副本
     * @return 处理器列表副本
     */
    public List<Handler> getHandlers() {
        return new ArrayList<>(handlers);
    }
}

2. 高级链式构建器

java 复制代码
/**
 * 高级责任链构建器
 * 提供更多高级功能,如条件添加、批量操作等
 */
public class AdvancedChainBuilder<T, R> extends DefaultChainBuilder<T, R> {
    
    private final Map<String, Object> properties;
    
    public AdvancedChainBuilder() {
        super();
        this.properties = new HashMap<>();
    }
    
    /**
     * 条件性添加处理器
     * @param condition 条件
     * @param handler 处理器
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> addHandlerIf(boolean condition, Handler handler) {
        if (condition) {
            addHandler(handler);
        }
        return this;
    }
    
    /**
     * 条件性添加处理器
     * @param condition 条件供应商
     * @param handler 处理器
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> addHandlerIf(Supplier<Boolean> condition, Handler handler) {
        if (condition.get()) {
            addHandler(handler);
        }
        return this;
    }
    
    /**
     * 批量添加处理器
     * @param handlers 处理器数组
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> addHandlers(Handler... handlers) {
        for (Handler handler : handlers) {
            addHandler(handler);
        }
        return this;
    }
    
    /**
     * 批量添加处理器类型
     * @param handlerClasses 处理器类型数组
     * @return 构建器实例
     */
    @SafeVarargs
    public final AdvancedChainBuilder<T, R> addHandlers(Class<? extends Handler>... handlerClasses) {
        for (Class<? extends Handler> handlerClass : handlerClasses) {
            addHandler(handlerClass);
        }
        return this;
    }
    
    /**
     * 从集合添加处理器
     * @param handlers 处理器集合
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> addHandlers(Collection<Handler> handlers) {
        for (Handler handler : handlers) {
            addHandler(handler);
        }
        return this;
    }
    
    /**
     * 设置构建器属性
     * @param key 属性键
     * @param value 属性值
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> setProperty(String key, Object value) {
        properties.put(key, value);
        return this;
    }
    
    /**
     * 获取构建器属性
     * @param key 属性键
     * @return 属性值
     */
    public Object getProperty(String key) {
        return properties.get(key);
    }
    
    /**
     * 根据条件过滤处理器
     * @param predicate 过滤条件
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> filterHandlers(Predicate<Handler> predicate) {
        List<Handler> currentHandlers = getHandlers();
        clear();
        currentHandlers.stream()
                      .filter(predicate)
                      .forEach(this::addHandler);
        return this;
    }
    
    /**
     * 对处理器进行排序
     * @param comparator 比较器
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> sortHandlers(Comparator<Handler> comparator) {
        List<Handler> currentHandlers = getHandlers();
        currentHandlers.sort(comparator);
        clear();
        addHandlers(currentHandlers);
        return this;
    }
    
    /**
     * 在指定处理器之前插入新处理器
     * @param targetHandler 目标处理器
     * @param newHandler 新处理器
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> insertBefore(Handler targetHandler, Handler newHandler) {
        List<Handler> currentHandlers = getHandlers();
        int index = currentHandlers.indexOf(targetHandler);
        if (index >= 0) {
            insertHandler(index, newHandler);
        }
        return this;
    }
    
    /**
     * 在指定处理器之后插入新处理器
     * @param targetHandler 目标处理器
     * @param newHandler 新处理器
     * @return 构建器实例
     */
    public AdvancedChainBuilder<T, R> insertAfter(Handler targetHandler, Handler newHandler) {
        List<Handler> currentHandlers = getHandlers();
        int index = currentHandlers.indexOf(targetHandler);
        if (index >= 0 && index < currentHandlers.size() - 1) {
            insertHandler(index + 1, newHandler);
        } else if (index == currentHandlers.size() - 1) {
            addHandler(newHandler);
        }
        return this;
    }
}

动态添加处理器

1. 处理器工厂

java 复制代码
/**
 * 处理器工厂接口
 * 负责创建处理器实例
 */
public interface HandlerFactory {
    
    /**
     * 根据类型创建处理器
     * @param handlerClass 处理器类型
     * @return 处理器实例
     */
    Handler createHandler(Class<? extends Handler> handlerClass);
    
    /**
     * 根据名称创建处理器
     * @param handlerName 处理器名称
     * @return 处理器实例
     */
    Handler createHandler(String handlerName);
    
    /**
     * 注册处理器类型
     * @param name 处理器名称
     * @param handlerClass 处理器类型
     */
    void registerHandler(String name, Class<? extends Handler> handlerClass);
}

/**
 * 默认处理器工厂实现
 */
public class DefaultHandlerFactory implements HandlerFactory {
    
    private final Map<String, Class<? extends Handler>> handlerRegistry;
    private static final Logger logger = LoggerFactory.getLogger(DefaultHandlerFactory.class);
    
    public DefaultHandlerFactory() {
        this.handlerRegistry = new ConcurrentHashMap<>();
        registerDefaultHandlers();
    }
    
    @Override
    public Handler createHandler(Class<? extends Handler> handlerClass) {
        try {
            Constructor<? extends Handler> constructor = handlerClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            Handler handler = constructor.newInstance();
            logger.debug("Created handler: {}", handlerClass.getSimpleName());
            return handler;
        } catch (Exception e) {
            throw new HandlerCreationException("Failed to create handler: " + handlerClass.getName(), e);
        }
    }
    
    @Override
    public Handler createHandler(String handlerName) {
        Class<? extends Handler> handlerClass = handlerRegistry.get(handlerName);
        if (handlerClass == null) {
            throw new HandlerCreationException("Unknown handler: " + handlerName);
        }
        return createHandler(handlerClass);
    }
    
    @Override
    public void registerHandler(String name, Class<? extends Handler> handlerClass) {
        handlerRegistry.put(name, handlerClass);
        logger.info("Registered handler: {} -> {}", name, handlerClass.getName());
    }
    
    private void registerDefaultHandlers() {
        // 注册默认的处理器类型
        registerHandler("auth", AuthenticationHandler.class);
        registerHandler("validation", ValidationHandler.class);
        registerHandler("business", BusinessLogicHandler.class);
    }
}

2. Spring集成的处理器工厂

java 复制代码
/**
 * Spring集成的处理器工厂
 * 利用Spring容器来创建和管理处理器
 */
@Component
public class SpringHandlerFactory implements HandlerFactory, ApplicationContextAware {
    
    private ApplicationContext applicationContext;
    private final Map<String, Class<? extends Handler>> handlerRegistry;
    
    public SpringHandlerFactory() {
        this.handlerRegistry = new ConcurrentHashMap<>();
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        scanAndRegisterHandlers();
    }
    
    @Override
    public Handler createHandler(Class<? extends Handler> handlerClass) {
        try {
            // 尝试从Spring容器获取
            return applicationContext.getBean(handlerClass);
        } catch (NoSuchBeanDefinitionException e) {
            // 如果容器中没有,则手动创建
            return createHandlerManually(handlerClass);
        }
    }
    
    @Override
    public Handler createHandler(String handlerName) {
        try {
            // 尝试从Spring容器获取
            return applicationContext.getBean(handlerName, Handler.class);
        } catch (NoSuchBeanDefinitionException e) {
            // 如果容器中没有,则查找注册的类型
            Class<? extends Handler> handlerClass = handlerRegistry.get(handlerName);
            if (handlerClass != null) {
                return createHandler(handlerClass);
            }
            throw new HandlerCreationException("Unknown handler: " + handlerName);
        }
    }
    
    @Override
    public void registerHandler(String name, Class<? extends Handler> handlerClass) {
        handlerRegistry.put(name, handlerClass);
    }
    
    private Handler createHandlerManually(Class<? extends Handler> handlerClass) {
        try {
            Constructor<? extends Handler> constructor = handlerClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            Handler handler = constructor.newInstance();
            
            // 如果是Spring Bean,进行依赖注入
            applicationContext.getAutowireCapableBeanFactory().autowireBean(handler);
            
            return handler;
        } catch (Exception e) {
            throw new HandlerCreationException("Failed to create handler: " + handlerClass.getName(), e);
        }
    }
    
    private void scanAndRegisterHandlers() {
        // 扫描所有Handler类型的Bean
        Map<String, Handler> handlerBeans = applicationContext.getBeansOfType(Handler.class);
        for (Map.Entry<String, Handler> entry : handlerBeans.entrySet()) {
            String beanName = entry.getKey();
            Class<? extends Handler> handlerClass = entry.getValue().getClass();
            registerHandler(beanName, handlerClass);
        }
    }
}

3. 配置驱动的链构建

java 复制代码
/**
 * 配置驱动的链构建器
 * 支持从配置文件或数据库加载链配置
 */
public class ConfigurableChainBuilder<T, R> extends AdvancedChainBuilder<T, R> {
    
    private final HandlerFactory handlerFactory;
    
    public ConfigurableChainBuilder(HandlerFactory handlerFactory) {
        super();
        this.handlerFactory = handlerFactory;
    }
    
    /**
     * 从配置加载链
     * @param config 链配置
     * @return 构建器实例
     */
    public ConfigurableChainBuilder<T, R> loadFromConfig(ChainConfig config) {
        clear();
        
        for (HandlerConfig handlerConfig : config.getHandlers()) {
            Handler handler = createHandlerFromConfig(handlerConfig);
            addHandler(handler);
        }
        
        return this;
    }
    
    /**
     * 从JSON配置加载链
     * @param jsonConfig JSON配置字符串
     * @return 构建器实例
     */
    public ConfigurableChainBuilder<T, R> loadFromJson(String jsonConfig) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            ChainConfig config = mapper.readValue(jsonConfig, ChainConfig.class);
            return loadFromConfig(config);
        } catch (Exception e) {
            throw new ChainConfigurationException("Failed to load chain from JSON", e);
        }
    }
    
    /**
     * 从YAML配置加载链
     * @param yamlConfig YAML配置字符串
     * @return 构建器实例
     */
    public ConfigurableChainBuilder<T, R> loadFromYaml(String yamlConfig) {
        try {
            ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
            ChainConfig config = mapper.readValue(yamlConfig, ChainConfig.class);
            return loadFromConfig(config);
        } catch (Exception e) {
            throw new ChainConfigurationException("Failed to load chain from YAML", e);
        }
    }
    
    private Handler createHandlerFromConfig(HandlerConfig handlerConfig) {
        Handler handler;
        
        if (handlerConfig.getClassName() != null) {
            try {
                Class<? extends Handler> handlerClass = 
                    (Class<? extends Handler>) Class.forName(handlerConfig.getClassName());
                handler = handlerFactory.createHandler(handlerClass);
            } catch (ClassNotFoundException e) {
                throw new ChainConfigurationException("Handler class not found: " + handlerConfig.getClassName(), e);
            }
        } else if (handlerConfig.getName() != null) {
            handler = handlerFactory.createHandler(handlerConfig.getName());
        } else {
            throw new ChainConfigurationException("Handler configuration must specify either className or name");
        }
        
        // 设置处理器属性
        setHandlerProperties(handler, handlerConfig.getProperties());
        
        return handler;
    }
    
    private void setHandlerProperties(Handler handler, Map<String, Object> properties) {
        if (properties == null || properties.isEmpty()) {
            return;
        }
        
        // 使用反射设置属性
        Class<?> handlerClass = handler.getClass();
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
            try {
                Field field = handlerClass.getDeclaredField(entry.getKey());
                field.setAccessible(true);
                field.set(handler, entry.getValue());
            } catch (Exception e) {
                logger.warn("Failed to set property {} on handler {}", 
                           entry.getKey(), handlerClass.getSimpleName(), e);
            }
        }
    }
}

使用示例

1. 基本使用

java 复制代码
public class BasicChainBuildingExample {
    
    public void buildBasicChain() {
        // 使用流式API构建链
        Handler chain = new DefaultChainBuilder<UserRequest, UserResponse>()
            .addHandler(new AuthenticationHandler())
            .addHandler(new ValidationHandler())
            .addHandler(new BusinessLogicHandler())
            .build();
        
        // 执行链
        Context<UserRequest, UserResponse> context = 
            new DefaultContext<>(new UserRequest());
        chain.handle(context);
    }
}

2. 高级使用

java 复制代码
public class AdvancedChainBuildingExample {
    
    public void buildAdvancedChain() {
        boolean enableAuth = true;
        boolean enableValidation = false;
        
        Handler chain = new AdvancedChainBuilder<UserRequest, UserResponse>()
            // 条件性添加处理器
            .addHandlerIf(enableAuth, new AuthenticationHandler())
            .addHandlerIf(enableValidation, new ValidationHandler())
            // 批量添加处理器
            .addHandlers(
                new AuthorizationHandler(),
                new BusinessLogicHandler(),
                new AuditHandler()
            )
            // 设置属性
            .setProperty("environment", "production")
            .setProperty("debug", false)
            // 过滤处理器
            .filterHandlers(handler -> !(handler instanceof AuditHandler))
            .build();
    }
}

3. 配置驱动使用

yaml 复制代码
# chain-config.yaml
handlers:
  - name: "auth"
    properties:
      timeout: 5000
      retries: 3
  - className: "com.example.ValidationHandler"
    properties:
      strict: true
  - name: "business"
java 复制代码
public class ConfigDrivenChainExample {
    
    public void buildFromConfig() {
        HandlerFactory factory = new SpringHandlerFactory();
        
        Handler chain = new ConfigurableChainBuilder<UserRequest, UserResponse>(factory)
            .loadFromYaml(loadYamlConfig())
            .build();
    }
    
    private String loadYamlConfig() {
        // 从文件或资源加载YAML配置
        return "...";
    }
}

4. 动态链构建

java 复制代码
public class DynamicChainExample {
    
    public void buildDynamicChain() {
        AdvancedChainBuilder<UserRequest, UserResponse> builder = 
            new AdvancedChainBuilder<>();
        
        // 根据运行时条件动态添加处理器
        if (isProductionEnvironment()) {
            builder.addHandler(new SecurityHandler())
                   .addHandler(new AuditHandler());
        }
        
        if (isDebugMode()) {
            builder.addHandler(new DebugHandler());
        }
        
        // 根据用户角色添加不同的处理器
        String userRole = getCurrentUserRole();
        switch (userRole) {
            case "ADMIN":
                builder.addHandler(new AdminHandler());
                break;
            case "USER":
                builder.addHandler(new UserHandler());
                break;
            default:
                builder.addHandler(new GuestHandler());
        }
        
        Handler chain = builder.build();
    }
    
    private boolean isProductionEnvironment() {
        return "production".equals(System.getProperty("environment"));
    }
    
    private boolean isDebugMode() {
        return Boolean.parseBoolean(System.getProperty("debug"));
    }
    
    private String getCurrentUserRole() {
        // 获取当前用户角色
        return "USER";
    }
}

最佳实践

1. 构建器复用

java 复制代码
public class ChainBuilderReuse {
    
    // 创建可复用的构建器模板
    public static ChainBuilder<UserRequest, UserResponse> createBaseBuilder() {
        return new AdvancedChainBuilder<UserRequest, UserResponse>()
            .addHandler(new AuthenticationHandler())
            .addHandler(new ValidationHandler());
    }
    
    // 基于模板创建特定的链
    public Handler createUserChain() {
        return createBaseBuilder()
            .addHandler(new UserBusinessHandler())
            .build();
    }
    
    public Handler createAdminChain() {
        return createBaseBuilder()
            .addHandler(new AdminBusinessHandler())
            .addHandler(new AuditHandler())
            .build();
    }
}

2. 链验证

java 复制代码
public class ChainValidation {
    
    public static void validateChain(ChainBuilder builder) {
        if (builder.isEmpty()) {
            throw new IllegalStateException("Chain cannot be empty");
        }
        
        List<Handler> handlers = ((AdvancedChainBuilder) builder).getHandlers();
        
        // 检查必需的处理器
        boolean hasAuth = handlers.stream()
            .anyMatch(h -> h instanceof AuthenticationHandler);
        if (!hasAuth) {
            throw new IllegalStateException("Chain must contain AuthenticationHandler");
        }
        
        // 检查处理器顺序
        int authIndex = findHandlerIndex(handlers, AuthenticationHandler.class);
        int businessIndex = findHandlerIndex(handlers, BusinessLogicHandler.class);
        if (authIndex > businessIndex) {
            throw new IllegalStateException("AuthenticationHandler must come before BusinessLogicHandler");
        }
    }
    
    private static int findHandlerIndex(List<Handler> handlers, Class<?> handlerClass) {
        for (int i = 0; i < handlers.size(); i++) {
            if (handlerClass.isInstance(handlers.get(i))) {
                return i;
            }
        }
        return -1;
    }
}

3. 性能优化

java 复制代码
public class PerformanceOptimization {
    
    // 使用对象池减少创建开销
    private static final ObjectPool<DefaultChainBuilder> BUILDER_POOL = 
        new GenericObjectPool<>(new ChainBuilderFactory());
    
    public static ChainBuilder borrowBuilder() {
        try {
            return BUILDER_POOL.borrowObject();
        } catch (Exception e) {
            return new DefaultChainBuilder();
        }
    }
    
    public static void returnBuilder(ChainBuilder builder) {
        try {
            builder.clear(); // 清理状态
            BUILDER_POOL.returnObject((DefaultChainBuilder) builder);
        } catch (Exception e) {
            // 忽略归还失败
        }
    }
    
    // 缓存常用的链
    private static final Map<String, Handler> CHAIN_CACHE = new ConcurrentHashMap<>();
    
    public static Handler getCachedChain(String chainType) {
        return CHAIN_CACHE.computeIfAbsent(chainType, type -> {
            switch (type) {
                case "user":
                    return createUserChain();
                case "admin":
                    return createAdminChain();
                default:
                    return createDefaultChain();
            }
        });
    }
}

总结

链式构建是责任链框架的重要特性,它提供了:

  1. 流式API:使链的构建更加直观和易读
  2. 灵活配置:支持动态添加、删除、重排序处理器
  3. 类型安全:编译时检查,减少运行时错误
  4. 配置驱动:支持从外部配置文件加载链定义
  5. Spring集成:与Spring框架无缝集成

通过合理使用构建器模式,我们可以创建出既强大又易用的责任链框架。在下一章中,我们将详细介绍责任链的执行流程。

相关推荐
原来是好奇心3 小时前
Spring Boot 事务失效的八大原因及解决方案详解
spring·springboot·事务
Dylan的码园3 小时前
try-catch:异常处理的最佳实践与陷阱规避
java·开发语言·eclipse
凝孑·哒哒哒3 小时前
从一道面试题开始:如何让同时启动的线程按顺序执行?
java·开发语言·面试
渣哥4 小时前
Java 方法传参,到底是值还是引用?
java
伍树明4 小时前
本地搭建搜索Agent(SpringAI + RAG + SearXNG + MCP)
java·spring·agent·mcp
怎么面试4 小时前
EasyExcel 基础用法
java·服务器
huaiqiongying4 小时前
Springboot3+SpringSecurity6Oauth2+vue3前后端分离认证授权-客户端
java·vue.js·spring boot
华仔啊4 小时前
Java异常处理别再瞎搞了!阿里大神总结的 9 种最佳实践,让你的代码更健壮!
java·后端
杨杨杨大侠4 小时前
手搓责任链框架 5:执行流程
java·spring·github