手搓责任链框架 2:核心接口设计

时间:2025-09-03 11:30:02来源:互联网

下面小编就为大家分享一篇手搓责任链框架 2:核心接口设计,具有很好的参考价值,希望对大家有所帮助。

核心接口设计

概述

在责任链框架的设计中,核心接口的设计至关重要。一个好的接口设计应该具备清晰的职责划分、良好的扩展性和易用性。本章将详细介绍责任链框架的核心接口设计。

整体架构

image.png

核心接口定义

1. Handler 接口

Handler 是责任链中最核心的接口,定义了处理者的基本行为。

/**
 * 责任链处理者接口
 * 定义了处理者的基本行为规范
 */
public interface Handler {
    
    /**
     * 处理请求的核心方法
     * @param context 处理上下文,包含请求和响应信息
     * @return true表示继续传递给下一个处理者,false表示中断链式调用
     */
    boolean handle(Context context);
    
    /**
     * 设置下一个处理者
     * @param handler 下一个处理者
     */
    void setNext(Handler handler);
    
    /**
     * 获取下一个处理者
     * @return 下一个处理者,如果没有则返回null
     */
    Handler getNext();
}

设计要点:

  • 简洁性:接口方法尽可能少,职责单一
  • 返回值语义boolean 返回值明确表示是否继续传递
  • 链式结构:通过 setNextgetNext 方法维护链式关系

2. Context 上下文接口

Context 负责在处理者之间传递数据,是责任链中的数据载体。

/**
 * 责任链上下文接口
 * 负责在处理者之间传递数据
 * @param <T> 请求类型
 * @param <R> 响应类型
 */
public interface Context<T, R> {
    
    /**
     * 获取请求对象
     * @return 请求对象
     */
    T getRequest();
    
    /**
     * 获取响应对象
     * @return 响应对象
     */
    R getResponse();
    
    /**
     * 设置响应对象
     * @param response 响应对象
     */
    void setResponse(R response);
    
    /**
     * 获取属性值
     * @param key 属性键
     * @return 属性值
     */
    Object getAttribute(String key);
    
    /**
     * 设置属性值
     * @param key 属性键
     * @param value 属性值
     */
    void setAttribute(String key, Object value);
    
    /**
     * 移除属性
     * @param key 属性键
     * @return 被移除的属性值
     */
    Object removeAttribute(String key);
    
    /**
     * 获取所有属性键
     * @return 属性键集合
     */
    Set<String> getAttributeKeys();
    
    /**
     * 类型安全的属性获取方法
     * @param key 属性键
     * @param type 属性值类型
     * @param <V> 泛型类型
     * @return 指定类型的属性值
     */
    <V> V getAttribute(String key, Class<V> type);
}

设计要点:

  • 泛型支持:支持类型安全的请求和响应对象
  • 属性机制:提供灵活的属性存储机制,便于处理者间数据传递
  • 类型安全:提供类型安全的属性获取方法

抽象基类实现

AbstractHandler 抽象类

为了简化具体处理者的实现,我们提供一个抽象基类:

/**
 * 抽象处理者基类
 * 提供了责任链的基本实现和生命周期钩子方法
 * @param <T> 请求类型
 * @param <R> 响应类型
 */
public abstract class AbstractHandler<T, R> implements Handler {
    
    private Handler nextHandler;
    private static final Logger logger = LoggerFactory.getLogger(AbstractHandler.class);
    
    @Override
    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }
    
    @Override
    public Handler getNext() {
        return nextHandler;
    }
    
    @Override
    public final boolean handle(Context context) {
        try {
            // 前置处理
            onBefore(context);
            
            // 检查是否应该跳过当前处理者
            if (shouldSkip(context)) {
                logger.debug("Handler {} skipped", this.getClass().getSimpleName());
                return invokeNext(context);
            }
            
            // 执行具体的处理逻辑
            boolean continueChain = doHandle(context);
            
            // 后置处理
            onAfter(context);
            
            // 根据处理结果决定是否继续传递
            if (continueChain) {
                return invokeNext(context);
            } else {
                logger.debug("Chain stopped at handler {}", this.getClass().getSimpleName());
                return false;
            }
            
        } catch (Exception e) {
            logger.error("Error in handler {}", this.getClass().getSimpleName(), e);
            onError(context, e);
            throw new ChainExecutionException("Handler execution failed", e);
        }
    }
    
    /**
     * 具体的处理逻辑,由子类实现
     * @param context 处理上下文
     * @return true表示继续传递,false表示中断链式调用
     */
    protected abstract boolean doHandle(Context<T, R> context);
    
    /**
     * 判断是否应该跳过当前处理者
     * @param context 处理上下文
     * @return true表示跳过,false表示不跳过
     */
    protected boolean shouldSkip(Context<T, R> context) {
        return false;
    }
    
    /**
     * 前置处理钩子方法
     * @param context 处理上下文
     */
    protected void onBefore(Context<T, R> context) {
        // 默认空实现
    }
    
    /**
     * 后置处理钩子方法
     * @param context 处理上下文
     */
    protected void onAfter(Context<T, R> context) {
        // 默认空实现
    }
    
    /**
     * 异常处理钩子方法
     * @param context 处理上下文
     * @param e 异常信息
     */
    protected void onError(Context<T, R> context, Exception e) {
        // 默认空实现,子类可以重写进行自定义异常处理
    }
    
    /**
     * 调用下一个处理者
     * @param context 处理上下文
     * @return 下一个处理者的处理结果
     */
    private boolean invokeNext(Context context) {
        if (nextHandler != null) {
            return nextHandler.handle(context);
        }
        return true; // 链的末尾,默认返回true
    }
}

设计要点:

  • 模板方法模式handle 方法定义了处理的标准流程
  • 生命周期钩子:提供前置、后置、异常处理等钩子方法
  • 跳过机制:支持条件性跳过某个处理者
  • 异常处理:统一的异常处理机制

上下文实现

DefaultContext 默认实现

/**
 * 默认的上下文实现
 * @param <T> 请求类型
 * @param <R> 响应类型
 */
public class DefaultContext<T, R> implements Context<T, R> {
    
    private final T request;
    private R response;
    private final Map<String, Object> attributes;
    
    public DefaultContext(T request) {
        this.request = request;
        this.attributes = new ConcurrentHashMap<>();
    }
    
    public DefaultContext(T request, R response) {
        this.request = request;
        this.response = response;
        this.attributes = new ConcurrentHashMap<>();
    }
    
    @Override
    public T getRequest() {
        return request;
    }
    
    @Override
    public R getResponse() {
        return response;
    }
    
    @Override
    public void setResponse(R response) {
        this.response = response;
    }
    
    @Override
    public Object getAttribute(String key) {
        return attributes.get(key);
    }
    
    @Override
    public void setAttribute(String key, Object value) {
        if (value == null) {
            attributes.remove(key);
        } else {
            attributes.put(key, value);
        }
    }
    
    @Override
    public Object removeAttribute(String key) {
        return attributes.remove(key);
    }
    
    @Override
    public Set<String> getAttributeKeys() {
        return new HashSet<>(attributes.keySet());
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public <V> V getAttribute(String key, Class<V> type) {
        Object value = getAttribute(key);
        if (value == null) {
            return null;
        }
        if (type.isInstance(value)) {
            return (V) value;
        }
        throw new ClassCastException(
            String.format("Attribute '%s' is not of type %s", key, type.getName())
        );
    }
    
    @Override
    public String toString() {
        return String.format("DefaultContext{request=%s, response=%s, attributes=%s}", 
                           request, response, attributes);
    }
}

异常定义

ChainExecutionException

/**
 * 责任链执行异常
 */
public class ChainExecutionException extends RuntimeException {
    
    public ChainExecutionException(String message) {
        super(message);
    }
    
    public ChainExecutionException(String message, Throwable cause) {
        super(message, cause);
    }
    
    public ChainExecutionException(Throwable cause) {
        super(cause);
    }
}

链式调用方法签名

ChainBuilder 接口

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

使用示例

基本使用

// 创建具体的处理者
Handler authHandler = new AuthenticationHandler();
Handler validationHandler = new ValidationHandler();
Handler businessHandler = new BusinessHandler();

// 手动构建链
authHandler.setNext(validationHandler);
validationHandler.setNext(businessHandler);

// 创建上下文
Context<UserRequest, UserResponse> context = 
    new DefaultContext<>(new UserRequest("user123"));

// 执行责任链
boolean result = authHandler.handle(context);

// 获取处理结果
UserResponse response = context.getResponse();

使用构建器

// 使用构建器创建链
Handler chain = new DefaultChainBuilder()
    .addHandler(new AuthenticationHandler())
    .addHandler(new ValidationHandler())
    .addHandler(new BusinessHandler())
    .build();

// 执行链
Context<UserRequest, UserResponse> context = 
    new DefaultContext<>(new UserRequest("user123"));
boolean result = chain.handle(context);

设计原则总结

1. 单一职责原则

  • 每个接口都有明确的职责
  • Handler 负责处理逻辑
  • Context 负责数据传递
  • ChainBuilder 负责链的构建

2. 开闭原则

  • 接口对扩展开放,对修改关闭
  • 可以轻松添加新的处理者类型
  • 可以扩展上下文的功能

3. 依赖倒置原则

  • 依赖抽象而不是具体实现
  • 使用接口定义契约
  • 便于测试和模拟

4. 接口隔离原则

  • 接口尽可能小而专一
  • 避免臃肿的接口设计
  • 客户端不应该依赖它不需要的接口

总结

良好的核心接口设计是责任链框架成功的基础。通过清晰的职责划分、合理的抽象层次和灵活的扩展机制,我们可以构建出既强大又易用的责任链框架。

在下一章中,我们将详细介绍如何基于这些核心接口实现具体的处理器。

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!