You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
18 lines
2.2 KiB
18 lines
2.2 KiB
检查策略解耦与封装
|
|
解耦方面:策略接口、工厂、使用者三层结构清晰,使用者与具体爬取算法完全解耦,新增 / 修改网站策略不影响上层命令与主程序,符合开闭原则;仅主程序存在少量硬编码注册,不影响整体解耦效果。
|
|
2. 封装方面:策略实现细节、策略集合、数据模型均做到私有隐藏、接口暴露,外部只能通过规范接口交互,有效隔离内部变化,封装完整、安全。
|
|
3. 整体架构:策略模式 + 命令模式 + 工厂模式组合,职责清晰、依赖单向、无循环依赖,具备良好的可维护性与扩展性。
|
|
|
|
检查开闭原则达成度等
|
|
审计结论:
|
|
1. 开闭原则:项目采用命令模式 + 策略模式,新增命令只需实现Command2接口、新增策略只需实现CrawlStrategy2接口,无需修改主程序和工厂代码,完全符合对扩展开放、对修改关闭的原则。
|
|
2. Repository 封装:ArticleRepository内部集合用private final修饰,外部仅能通过add/addAll方法添加,且返回的是Collections.unmodifiableList不可修改视图,同时对null做了严格防御,封装完备,数据安全。
|
|
3. 循环依赖:所有组件均通过构造方法依赖注入,依赖方向为Main2 → 命令/工厂/仓库 → 模型,无反向依赖,不存在循环依赖问题。
|
|
|
|
进阶探究题答案
|
|
题目:不用工厂,直接用Map<String, CrawlStrategy>存起来 vs StrategyFactory的区别?
|
|
直接用Map存储策略,虽然实现简单,但存在明显局限:
|
|
1. 耦合度高:调用方需要直接维护Map的注册和匹配逻辑,新增策略时需要修改调用方代码,违反开闭原则。
|
|
2. 扩展性差:无法在匹配逻辑中添加复杂规则(如优先级、默认策略、正则匹配),后续扩展困难。
|
|
3. 可维护性低:匹配逻辑散落在业务代码中,难以统一管理和修改。
|
|
而StrategyFactory将策略的注册、匹配逻辑封装为独立组件,调用方仅依赖工厂接口,无需关心具体实现;新增策略只需注册到工厂,不影响其他代码,既降低耦合,又提升了扩展性和可维护性,更符合面向对象设计规范。
|