封装与多态协同解耦系统:封装隔离调度核心的稳定边界,隐藏内部规则与流程;多态通过策略接口实现扩展模块零侵入接入;策略选取由封装的工厂类统一管理,避免硬编码和破坏性修改。

封装与多态不是孤立的语法技巧,而是协同解耦系统的核心设计杠杆:封装把调度逻辑的“变”与“不变”切分开,多态让扩展模块能插拔式替换而不改调度主干。
用封装隔离调度核心的稳定边界
调度模块(如订单分发、任务路由)必须保持高度稳定。通过封装,将调度策略的判断条件、执行流程、状态流转全部收口在私有方法和受控接口中,对外只暴露一个简洁的 dispatch() 入口。
- 所有内部规则(比如优先级计算、超时阈值、重试次数)都设为 private 字段 + 构造器注入或配置中心加载,不提供 setter
- 关键流程方法(如
selectExecutor()、recordResult())设为 package-private 或 private,仅在本类内调用 - 暴露的 public 方法里不做业务判断,只做参数校验和结果封装,例如:
public DispatchResult dispatch(Order order)—— 输入是领域对象,输出是结构化结果,不暴露中间状态
用多态实现扩展模块的零侵入接入
当需要新增一种调度策略(比如从轮询改为权重随机,或接入 AI 预测路由),不修改原有调度类,而是定义统一抽象:
- 声明
interface DispatchStrategy,含select(Iterable<node> candidates, Order order)</node>方法 - 每个具体策略(
RoundRobinStrategy、WeightedRandomStrategy、AiPredictiveStrategy)独立实现该接口 - 调度主类通过构造器或 Spring 的
@Autowired List<dispatchstrategy></dispatchstrategy>拿到所有策略,运行时根据配置 key 或上下文动态选择
组合封装与多态的关键衔接点
真正解耦发生在“谁决定用哪个策略”这一环节。这里不能硬编码 if-else,而要靠封装好的策略工厂 + 多态调用:
- 写一个
StrategyFactory类,内部维护Map<string dispatchstrategy></string>,key 来自配置或请求头 - 该工厂本身被封装:构造时加载全部策略,对外只提供
getStrategy(String type),且该方法加缓存、做空校验、记录未命中日志 - 调度主类调用
factory.getStrategy("weighted").select(...)—— 调用的是多态接口,但策略选取逻辑完全被封装隐藏
避免常见陷阱:封装不等于 getter/setter 泛滥,多态不等于 instanceof 判断
真实项目里最容易破坏解耦的两个动作:
- 给调度类加一堆 public setter,让外部随意改内部策略实例 —— 这等于撕开封装壳,直接暴露可变状态
- 在 dispatch 方法里写
if (strategy instanceof WeightedRandomStrategy)做特殊处理 —— 这违背多态本意,把扩展点又锁死了 - 正确做法是:策略行为差异全部收敛到各自
select()实现里;所有策略共性逻辑(如日志、监控、兜底)统一放在调度主类的封装方法中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











