Java责任链模式实现方式与测试方法
一、责任链模式的实现方式
- 基本实现结构
- 抽象处理者(Handler)
定义处理请求的接口,通常包含以下方法:handleRequest(Request request)
:抽象方法,处理请求的核心逻辑。setNext(Handler next)
:设置下一个处理者的引用,形成链式结构。
例如:
public abstract class Handler {protected Handler next;public void setNext(Handler next) { this.next = next; }public abstract void handleRequest(int request); }
- 具体处理者(Concrete Handler)
继承抽象处理者,实现处理逻辑。若无法处理请求,则传递给下一个处理者。例如:public class TeamLeader extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 1) {System.out.println("TeamLeader批准了" + days + "天假期");} else if (next != null) {next.handleRequest(days);}} }
- 客户端(Client)
负责组装处理链并提交请求。例如:public class LeaveRequest {public static void main(String[] args) {Handler teamLeader = new TeamLeader();Handler manager = new Manager();teamLeader.setNext(manager);teamLeader.handleRequest(2); // 输出:Manager批准了2天假期} }
- 扩展实现方式
- 支持中断的链式处理
处理者返回布尔值表示是否继续传递请求,若返回false
则终止链式传递。例如:
客户端通过遍历处理链并检查返回值决定是否继续传递。public interface Handler {boolean handle(Request request); }
- 动态构建链式结构
使用集合(如List
)动态添加处理者,适用于需要灵活配置的场景。例如:List handlers = new ArrayList<>(); handlers.add(new ConcreteHandlerA()); handlers.add(new ConcreteHandlerB()); for (int i = 0; i < handlers.size() - 1; i++) {handlers.get(i).setNext(handlers.get(i + 1)); }
二、测试方法
- 单元测试
- 验证单个处理者逻辑
测试每个具体处理者是否按预期处理请求。例如:@Test public void testTeamLeaderApproval() {TeamLeader leader = new TeamLeader();leader.handleRequest(1); // 预期输出:批准1天假期leader.handleRequest(2); // 预期不处理,传递给下一个处理者 }
- 验证链式传递
测试请求是否按链式顺序传递。例如:@Test public void testChainHandling() {Handler leader = new TeamLeader();Handler manager = new Manager();leader.setNext(manager);leader.handleRequest(3); // 预期输出:Manager批准3天假期 }
- 集成测试
- 模拟复杂场景
测试多级处理者协同处理请求的场景。例如:public class IntegrationTest {public static void main(String[] args) {Handler leader = new TeamLeader();Handler director = new Director();leader.setNext(director);leader.handleRequest(10); // 预期输出:Director批准10天假期} }
- 边界条件测试
验证处理者在边界值(如最大审批天数)下的行为。例如:@Test public void testBoundaryConditions() {Handler director = new Director();director.handleRequest(7); // 预期批准7天director.handleRequest(8); // 预期输出:无法批准 }
- 性能测试
- 链式长度影响
测试长链对性能的影响,例如处理1000次请求的耗时。 - 中断机制测试
验证中断链式传递的逻辑是否生效,例如处理者返回false
后是否停止传递。
三、优缺点与适用场景
优点
- 解耦请求发送者与处理者:客户端无需知道具体处理者,仅需提交请求。
- 灵活扩展:新增处理者无需修改现有代码,符合开闭原则。
- 动态配置:支持运行时动态调整处理链顺序或节点。
缺点 - 请求可能未被处理:若链末无处理者,请求可能被忽略。
- 性能损耗:长链可能导致处理延迟。
适用场景 - 审批流程(如请假、报销)。
- 过滤器链(如日志记录、权限校验)。
- 事件处理(如GUI事件冒泡)。
四、总结
Java责任链模式通过链式结构解耦请求与处理者,适用于需要动态处理请求的场景。其实现需关注抽象处理者的设计、具体处理者的逻辑实现,以及客户端的链式组装。测试时需覆盖单个处理者、链式传递、边界条件及性能等维度,确保系统健壮性。