1. 项目背景与痛点分析
最近在重构一个企业级应用的单点登录模块时,遇到了典型的代码维护难题。最初系统只需要对接一个外部认证系统,登录逻辑直接写在Service层,代码还算清晰。但随着业务发展,需要对接第二个外部系统时,我简单地在原有代码上增加了if-else分支。当第三个外部系统需要接入时,代码已经变成了这样:
java复制public String login(STymhDTO dto) {
if ("systemA".equals(dto.getType())) {
// 50行处理逻辑
} else if ("systemB".equals(dto.getType())) {
// 60行处理逻辑
} else if ("systemC".equals(dto.getType())) {
// 70行处理逻辑
}
// 更多if-else...
}
这种写法存在几个明显问题:
- 单个方法过于臃肿,动辄几百行代码
- 新增登录方式需要修改核心业务类,违反开闭原则
- 不同系统的登录逻辑高度耦合,难以单独测试
- 方法复杂度呈指数级增长,维护成本高
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 重构方案设计思路
2.1 设计模式选型考量
面对这种"同类型不同实现"的业务场景,策略模式是最佳选择。策略模式的核心思想是将算法或行为抽象为接口,使它们可以相互替换。在我们的案例中,不同外部系统的登录流程就是不同的策略实现。
但单纯使用策略模式还存在一个问题:客户端代码(Service层)仍然需要知道所有具体策略类,当新增策略时仍需修改客户端代码。因此需要引入工厂模式,将策略对象的创建过程封装起来。
2.2 整体架构设计
重构后的架构分为三个层次:
- 实体层:定义统一的参数传输对象(DTO)
- 策略层:抽象登录行为接口,实现具体策略类
- 工厂层:根据输入参数自动匹配策略
mermaid复制classDiagram
class STymhDTO {
+String tymhType
+String tymhUserName
//...其他字段
}
class ITymhHandler {
<<interface>>
+matches(STymhDTO): boolean
+handle(STymhDTO): String
}
class TymhHandlerFactory {
-List~ITymhHandler~ handlers
+getMatchedHandler(STymhDTO): ITymhHandler
}
class TymhLoginService {
-TymhHandlerFactory factory
+processLogin(STymhDTO): String
}
class SystemALoginHandler {
+matches(STymhDTO): boolean
+handle(STymhDTO): String
}
ITymhHandler <|-- SystemALoginHandler
ITymhHandler <|-- SystemBLoginHandler
ITymhHandler <|-- SystemCLoginHandler
TymhHandlerFactory --> ITymhHandler
TymhLoginS
