一、角色对比

类名 核心职责 设计模式关联 典型输入/输出
Handler 响应特定事件、请求或消息 责任链模式、观察者模式 事件/请求 → 响应/副作用
Manager 协调和管理资源或对象的生命周期与状态 单例模式、工厂模式 侧重内部状态维护与资源协调
Processor 对数据或任务进行转换、加工或增强 管道-过滤器模式、模板方法模式 输入数据 → 加工后的输出数据
Invoker 封装方法调用(目标、方法、参数),支持执行控制 命令模式 方法引用 + 参数 → 执行结果(含异常处理)
Delegate 将操作委托给其他对象以复用或适配行为 委托模式 输入 → 转发给被委托对象,返回其结果
Validator 验证数据是否符合业务规则或格式约束 常配合策略模式实现多规则校验) 待校验对象 → 校验通过 / 抛出异常或错误列表
Checker 检查系统状态、资源可用性或策略合规性 常用于诊断、健康检查 系统上下文/资源标识 → 布尔值或检查报告
Builder 分步构造复杂或不可变对象 构建器模式 多个配置项 → 构建完成的完整对象
Factory 封装对象创建逻辑,隐藏具体实现 工厂方法模式、抽象工厂模式 创建参数(可选) → 新创建的对象实例
Strategy 封装可互换的算法或行为逻辑 策略模式 输入数据 + 上下文 → 算法执行结果
Adapter 将一个接口转换为客户期望的另一个接口 适配器模式 不兼容接口的输入 → 转换为兼容接口的输出
Resolver 将抽象名称或标识解析为具体对象或资源 常用于查找与映射 逻辑名称(如视图名、变量名) → 具体对象/路径
Extractor 从复杂结构中提取所需字段或子信息 数据抽取 复杂结构(如 JSON、HTTP 请求) → 提取的字段值
Converter 在两种类型或格式之间进行双向或单向转换 转换器模式 源类型对象 → 目标类型对象
Provider 按需提供服务、配置或实例(支持延迟获取) 服务提供者接口(SPI)、依赖注入 无输入或简单键 → 返回所需服务/值
Executor 在特定上下文(如线程池)中执行任务 命令模式(间接)、调度模式 Runnable / Callable → 异步执行(无直接返回)
Orchestrator 流程协调器    

一、角色定义

1. Handler(处理器)

  • 职责:响应某一类事件、请求或消息,执行具体处理逻辑。
  • 场景:常用于事件驱动架构、Web 请求分发、异常处理链等。
    • 例如 Spring MVC 中的 @Controller 本质是请求 Handler;Netty 的 ChannelInboundHandler 处理网络读写事件。
  • 特点:高内聚、单一事件响应、常被调度器/分发器调用
// 场景:处理用户登录成功后的后续动作
public class LoginSuccessHandler {
    
  	public void handle(User user, HttpServletRequest request) {
        // 更新最后登录时间
        user.setLastLoginTime(System.currentTimeMillis());
        userService.update(user);

        // 记录安全日志
        securityLogger.log("User " + user.getId() + " logged in from " + request.getRemoteAddr());

        // 发送登录通知(异步)
        notificationService.sendAsync(user, "You've logged in successfully.");
    }
}

2. Manager(管理器)

  • 职责:协调和管理一组资源或对象的生命周期、状态或访问。
  • 场景:连接池管理(如 DataSource)、会话管理(如 Web Session)、缓存管理等。

  • 注意:避免让 Manager 变成“上帝类”——它应只负责协调,不包含核心业务逻辑。
// 场景:管理 WebSocket 连接
public class ConnectionManager {
    private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    public void add(String userId, WebSocketSession session) {
        sessions.put(userId, session);
    }

    public void broadcast(String message) {
        sessions.values().forEach(session -> {
            try {
                session.sendMessage(new TextMessage(message));
            } catch (IOException e) {
                // 处理断连
                remove(session.getId());
            }
        });
    }

    public void remove(String userId) {
        sessions.remove(userId);
    }
}

3. Processor(处理器 / 加工器)

  • 职责:对输入数据进行一系列转换、计算或增强,输出加工后的结果。
  • 场景:强调“处理”动作,常用于事件、消息、批处理
    • ETL 数据管道、订单处理流水线、SpringBeanPostProcessorKafka Streams 处理拓扑。
  • 特点:输入 → 输出明确,可组合成管道(Pipeline)
// 场景:处理原始传感器数据(过滤噪声 → 单位转换 → 聚合)
public class SensorDataProcessor {
    public ProcessedData process(RawSensorData raw) {
        if (raw.getValue() < 0 || raw.getValue() > 1000) {
            throw new InvalidDataException("Out of range");
        }

        // 转换为摄氏度(假设原始是毫伏)
        double celsius = raw.getValue() * 0.01 - 273.15;

        // 添加元信息
        return new ProcessedData(celsius, raw.getDeviceId(), System.currentTimeMillis());
    }
}

4. Invoker(调用者)

  • 职责:封装一个方法调用(含目标对象、方法、参数),支持延迟执行、重试、拦截等。
  • 场景:RPC 框架(如 Dubbo 的 Invoker 接口)、AOP 拦截器链、命令模式实现。
  • Executor 区别:Invoker 关注方法调用本身,Executor 关注任务执行环境(如线程池)。
// 场景:封装一个可重试的远程调用
public class RetryableInvoker {
    private final Object service;
    private final Method method;
    private final Object[] args;

    public RetryableInvoker(Object service, Method method, Object... args) {
        this.service = service;
        this.method = method;
        this.args = args;
    }

    public Object invoke(int maxRetries) throws Exception {
        for (int i = 0; i < maxRetries; i++) {
            try {
                return method.invoke(service, args);
            } catch (InvocationTargetException e) {
                if (i == maxRetries - 1) throw e;
                Thread.sleep(100 * (i + 1)); // 指数退避
            }
        }
        return null;
    }
}

5、 Delegate(委托者)

  • 职责:将操作“委托”给另一个对象执行,实现解耦或适配。
  • 场景:组合代替继承、代理模式、SpringDelegatingFilterProxy
  • 优势:解耦、运行时切换实现、避免继承爆炸
// 场景:支付服务委托给具体实现
public class PaymentService {
    private final PaymentGateway delegate; // 可注入 Alipay 或 Wechat

    public PaymentService(PaymentGateway gateway) {
        this.delegate = gateway;
    }

    public PaymentResult pay(Order order) {
        return delegate.processPayment(order); // 委托实际支付逻辑
    }
}

6. Validator(校验器)

  • 职责:验证数据是否符合业务规则或格式约束。
  • 场景:表单校验、API 参数校验(JSR-380)、领域对象合法性检查。

  • 原则:快速失败、不修改输入、只做判断
public class OrderValidator {
    public void validate(CreateOrderRequest request) {
        if (request.getItems().isEmpty()) {
            throw new ValidationException("Order must have at least one item");
        }
        if (request.getUserId() == null) {
            throw new ValidationException("User ID is required");
        }
        if (request.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
            throw new ValidationException("Total amount must be positive");
        }
    }
}

7. Checker(检查器)

  • 职责:探测系统状态、资源可用性或策略合规性。
  • 场景:健康检查(Health Check)、安全策略扫描、编译器类型检查。

  • Validator 区别:Checker 更偏向系统/环境状态评估,而非输入数据格式。
// 场景:检查用户是否有权限访问某资源
public class PermissionChecker {
    public boolean canAccess(User user, Resource resource) {
        if (user.isAdmin()) return true;
        return user.getRoles().stream()
                   .anyMatch(role -> role.hasPermission(resource.getRequiredPermission()));
    }
}

8. Builder(构建器)

  • 职责:分步构造复杂或不可变对象。
  • 场景:HTTP 请求构造(OkHttp)、SQL 查询构建(JOOQ)、配置对象创建。

  • 优势:可读性强、支持可选参数、保证对象完整性
public class Email {
    private final String to, subject, body;

    private Email(Builder builder) {
        this.to = builder.to;
        this.subject = builder.subject;
        this.body = builder.body;
    }

    public static class Builder {
        private String to, subject, body;

        public Builder to(String to) { this.to = to; return this; }
        public Builder subject(String subject) { this.subject = subject; return this; }
        public Builder body(String body) { this.body = body; return this; }

        public Email build() {
            if (to == null) throw new IllegalStateException("To is required");
            return new Email(this);
        }
    }
}

// 使用
Email email = new Email.Builder()
    .to("user@example.com")
    .subject("Welcome")
    .body("Hello!")
    .build();

9. Factory(工厂)

  • 职责:封装对象创建逻辑,隐藏具体实现类。
  • 场景:日志框架选择(SLF4J)、数据库连接获取、多态对象实例化。

  • 适用:创建逻辑复杂、需统一入口、实现可能变化
// 场景:根据文件类型创建解析器
public class DocumentParserFactory {
    
  public static DocumentParser create(String fileType) {
        switch (fileType.toLowerCase()) {
            case "pdf": return new PdfDocumentParser();
            case "docx": return new WordDocumentParser();
            default: throw new IllegalArgumentException("Unsupported type: " + fileType);
        }
    }
}

10. Strategy(策略)

  • 职责:封装可互换的算法或行为。
  • 场景:排序方式(升序/降序)、折扣计算(会员/节日)、路由策略。

  • 核心:算法与使用解耦,运行时动态切换
public interface DiscountStrategy {
    BigDecimal apply(BigDecimal originalPrice, User user);
}

public class VipDiscountStrategy implements DiscountStrategy {
    public BigDecimal apply(BigDecimal price, User user) {
        return price.multiply(BigDecimal.valueOf(0.8)); // 8折
    }
}

// 使用
DiscountStrategy strategy = user.isVip() ? new VipDiscountStrategy() : new NoDiscountStrategy();
BigDecimal finalPrice = strategy.apply(order.getTotal(), user);

11、Adapter(适配器)

  • 职责:将一个接口转换为客户期望的另一个接口。
  • 场景:旧系统集成、第三方 SDK 封装、Java I/O 流适配。
  • 价值:让不兼容的接口协同工作
// 场景:将第三方支付 SDK 适配为内部统一接口
public class AlipayAdapter implements PaymentGateway {
    private final AlipayClient alipayClient; // 第三方 SDK

    public PaymentResult processPayment(Order order) {
        AlipayRequest request = convertToAlipayRequest(order);
        AlipayResponse response = alipayClient.execute(request);
        return convertToInternalResult(response); // 适配返回格式
    }

    private AlipayRequest convertToAlipayRequest(Order order) { /* ... */ }
    private PaymentResult convertToInternalResult(AlipayResponse resp) { /* ... */ }
}

12、Resolver(解析器)

  • 职责:将抽象标识解析为具体对象或值。
  • 场景:视图名 → JSP 路径(Spring)、方法参数解析(@PathVariable)、DNS 解析。

  • 本质:名称到资源的映射
// 场景:将逻辑视图名解析为实际模板路径
public class ViewResolver {
    public String resolveViewName(String viewName) {
        return "/WEB-INF/views/" + viewName + ".jsp";
    }
}

// 使用:Controller 返回 "home" → 解析为 "/WEB-INF/views/home.jsp"

13、Extractor(提取器)

  • 职责:从复杂结构中抽取所需信息。
  • 场景:日志字段提取、HTTP Header 解析、JSON 路径取值。

  • 与 Converter 区别:Extractor 不改变数据形态,只做“选取”
// 场景:从 HTTP 请求中提取用户 Token
public class AuthTokenExtractor {
    public String extractToken(HttpServletRequest request) {
        String authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            return authHeader.substring(7); // 去掉 "Bearer "
        }
        return null;
    }
}

14. Converter / Transformer(转换器)

  • 职责:将一种类型或格式转换为另一种。
  • 场景:DTO ↔ Entity 映射、String ↔ Date、XML ↔ JSON。

  • 工具库:MapStruct、ModelMapper、Dozer
// 场景:将数据库实体转为 API 返回 DTO
public class UserEntityToDtoConverter {
    public UserDto convert(UserEntity entity) {
        UserDto dto = new UserDto();
        dto.setId(entity.getId());
        dto.setName(entity.getName());
        dto.setEmail(entity.getEmail());
        dto.setCreatedAt(entity.getCreatedAt().toString()); // Date → String
        return dto;
    }
}

15、Provider(提供者)

  • 职责:按需提供某个服务、配置或实例(常用于插件机制)。
  • 场景:日志实现提供(SLF4J)、云凭证提供(AWS SDK)、加密算法提供(Java Security)。

  • 优势:延迟加载、支持动态替换、便于测试 Mock
// 场景:提供当前请求的用户上下文
public class CurrentUserProvider {
    public User getCurrentUser() {
        String userId = RequestContextHolder.getCurrentUserId();
        return userService.findById(userId);
    }
}

// 在 Service 中使用
User currentUser = currentUserProvider.getCurrentUser();

16. Executor / Runner(执行器)

  • 职责:在特定上下文(如线程池、事务)中执行任务。

  • 场景:异步任务调度、测试用例运行、批处理作业。

  • Invoker 区别:Executor执行环境,Invoker调用本身

// 场景:在独立线程中执行耗时任务
public class AsyncTaskExecutor {
    private final ExecutorService executor = Executors.newFixedThreadPool(4);

    public void submit(Runnable task) {
        executor.submit(() -> {
            try {
                task.run();
            } catch (Exception e) {
                logger.error("Task failed", e);
            }
        });
    }
}

// 使用
asyncTaskExecutor.submit(() -> emailService.sendBulkEmails());

ContactAuthor