手搓责任链框架 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框架无缝集成

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

相关推荐
知兀7 分钟前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV9 分钟前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子12 分钟前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路1 小时前
C++20概述
java·开发语言·c++20
Championship.23.241 小时前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
橘子海全栈攻城狮1 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken1 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
冷雨夜中漫步2 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿2 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
one_love_zfl2 小时前
java面试-微服务组件篇
java·微服务·面试