1. 项目概述
在开发Web应用系统时,验证码功能几乎是标配的安全防护手段。最近我在重构一个多方式登录系统时,遇到了验证码模块的代码重复问题。系统支持图形验证码和短信验证码两种登录方式,这两种验证码的处理流程高度相似,但又存在关键差异。
传统的实现方式是把相似的代码复制粘贴到不同的处理器类中,这会导致维护噩梦。想象一下,当验证码有效期需要从5分钟调整到3分钟时,你需要在多个地方修改相同的逻辑,稍有不慎就会遗漏某个类中的修改。
这正是模板方法模式的用武之地。通过将通用逻辑抽取到抽象父类,让差异部分由子类实现,我们既能保证流程的统一性,又能灵活处理不同验证码类型的特殊需求。这种设计不仅减少了代码重复,更重要的是提高了系统的可维护性和扩展性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模板方法模式解析
2.1 模式定义与适用场景
模板方法模式属于行为型设计模式,其核心思想是:定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些特定步骤。
在我们的验证码场景中,模板方法模式特别适用,因为:
- 验证码处理的整体流程固定(生成→保存→发送)
- 只有发送环节的实现方式不同
- 需要确保所有验证码类型都遵循相同的安全处理逻辑
2.2 模式结构与UML
典型的模板方法模式包含以下角色:
- 抽象类(Abstract Class):定义算法骨架和基本操作,包含模板方法和基本方法
- 具体子类(Concrete Class):实现父类定义的抽象方法,完成特定步骤
在我们的实现中:
- AbstractValidateCodeProcessor就是抽象类
- ImageCodeProcessor和SmsCodeProcessor是具体子类
提示:模板方法模式与策略模式的区别在于,前者控制流程结构,后者注重算法替换。如果只是算法不同但步骤相同,用策略模式;如果流程步骤本身也需要定制,用模板方法模式。
3. 验证码系统设计
3.1 整体架构设计
系统采用分层架构设计:
code复制┌───────────────────────┐
│ Controller │
└──────────┬────────────┘
│
▼
┌───────────────────────┐
│ ValidateCodeProcessor │←─┐
└──────────┬────────────┘ │
│ │
▼ │
┌───────────────────────┐ │
│ AbstractValidateCode │ │
│ Processor │──┘
└──────────┬────────────┘
│
┌───────┴───────┐
▼ ▼
┌───────┐ ┌───────┐
│ Image │ │ SMS │
│ Code │ │ Code │
└───────┘ └───────┘
关键组件职责:
- ValidateCodeController:对外暴露验证码获取接口
- ValidateCodeProcessor:定义验证码处理接口
- AbstractValidateCodeProcessor:实现验证码处理模板
- ImageCodeProcessor/SmsCodeProcessor:具体验证码处理器
3.2 核心流程分析
验证码生成的核心三步流程:
- 生成验证码:调用ValidateCodeGenerator生成随机验证码
- 保存到Session:将验证码存入session供后续验证
- 发送验证码:根据类型返回图片或发送短信
其中第1、2步是通用逻辑,第3步需要差异化实现。
4. 关键代码实现
4.1 抽象处理器实现
java复制public abstract class AbstractValidateCodeProcessor<C extends ValidateCode>
implements ValidateCodeProcessor {
// 依赖的验证码生成器集合
@Autowired
private Map<String, ValidateCodeGenerator> validateCodeGenerators;
@Override
pub
