1. 从if-else地狱到责任链模式:代码可维护性革命
作为一名经历过无数if-else地狱折磨的Java开发者,我至今仍清晰地记得第一次看到下面这种代码时的绝望感:
java复制public void validateUser(String username, String password, String email) {
if (username == null || username.trim().isEmpty()) {
throw new IllegalArgumentException("用户名不能为空");
}
if (username.length() < 4) {
throw new IllegalArgumentException("用户名太短");
}
if (!username.matches("[a-zA-Z0-9_]+")) {
throw new IllegalArgumentException("用户名包含非法字符");
}
if (password == null || password.length() < 8) {
throw new IllegalArgumentException("密码长度不足");
}
// 还有更多if-else...
}
这种代码的问题显而易见:修改恐惧症(每次修改都担心影响其他逻辑)、重复劳动(同样的校验逻辑散落在各处)、可读性差(一眼看不到重点)。更可怕的是,当业务规则变更时(比如用户名允许中文),你需要在整个代码库中搜索所有相关if语句进行修改。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 责任链模式核心思想与实现
2.1 模式定义与UML结构
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下一个处理者。
标准UML类图包含以下角色:
- Handler:定义处理请求的接口,通常包含处理方法和设置后继者的方法
- ConcreteHandler:具体处理者,实现处理逻辑并决定是否将请求传递给下一个处理者
- Client:组装处理链并向链头发送请求
2.2 基础实现示例
让我们实现一个简单的用户验证责任链:
java复制// 抽象处理者
public abstract class Validator {
private Validator next;
public Validator setNext(Validator next) {
this.next = next;
return next;
}
public void validate(String input) throws ValidationException {
doValidate(input);
if (next != null) {
next.validate(input);
}
}
protected abstract void doValidate(String input) throws ValidationException;
}
// 具体处理者:非空校验
public class NotEmptyValidator extends Validator {
@Override
protected void doValidate(String input) throws ValidationException {
if (input == null || input.trim().isEmpty()) {
throw new ValidationException("输入不能为空");
}
}
}
// 具体处理者:长度校验
public class LengthValidator extends Validator {
private final int min;
private final int max;
public LengthValidator(int min, int max) {
this.min = min;
this.max = max;
}
@Override
protected void doValidate(String input) throws ValidationException {
if (input.length() < min || input.length() > max) {
throw new ValidationException("长度必须在" + min + "到" + max + "之间");
}
}
}
// 使用示例
Validator validatorChain = new NotEmptyValidator();
validatorChain.setNext(new LengthValidator(4, 20))
.setNext(new RegexValidator("[a-zA-Z0-9_]+"));
try {
validatorChain.validate("test_user");
} catch (ValidationException e) {
// 处理验证失败
}
2.3 高级实现技巧
2.3.1 链式构建器模式
为了更优雅地构建责任链,我们可以引入构建器模式:
java复制public class ValidatorChainBuilder {
private Validator head;
private Validator tail;
public ValidatorChainBuilder add(Validator validator) {
if (head == null) {
head = validator;
tail = validator;
} else {
tail.setNext(validator);
tail = validator;
}
return this;
}
