设计模式之_类名定义
一、角色对比
| 类名 | 核心职责 | 设计模式关联 | 典型输入/输出 |
|---|---|---|---|
| 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数据管道、订单处理流水线、Spring的BeanPostProcessor、Kafka 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(委托者)
- 职责:将操作“委托”给另一个对象执行,实现解耦或适配。
- 场景:组合代替继承、代理模式、
Spring的DelegatingFilterProxy。 - 优势:解耦、运行时切换实现、避免继承爆炸
// 场景:支付服务委托给具体实现
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());


