多态是运行时行为分发机制,通过父类或接口引用调用方法,由实际对象类型决定执行哪个实现;配合接口契约、模板方法、策略模式和工厂构建器等静态设计手段,实现可插拔、可替换、不侵入的扩展,符合开闭原则。

多态本身不是“动态组装”的工具,而是一种运行时行为分发机制——通过父类或接口引用调用方法时,由实际对象类型决定执行哪个实现。所谓“动态组装子类特有扩展行为”,在基础练习中应理解为:用多态配合清晰、静态可读的设计手段,让子类能力可插拔、可替换、不侵入原有结构,而不是靠反射、线程或运行时拼接代码。
用接口定义可选行为契约
把子类独有的能力抽象成独立接口,而非塞进继承链。例如定义 Flyable、Fetchable 等接口,Dog 实现 Fetchable,Bird 实现 Flyable,Cat 都不实现。
- 外部通过
if (animal instanceof Fetchable)安全判断,再调用((Fetchable) animal).fetch() - 更推荐方式:提供工厂方法如
Optional<fetchable> getFetcher(Animal a)</fetchable>,避免裸露 instanceof - 新增行为无需修改 Animal 类或已有子类,完全符合开闭原则
在父类中预留模板方法或钩子
父类定义主流程骨架,把可变部分留给子类定制。例如 Animal.hunt() 是模板方法,内部调用 doHunt()(默认空)和 afterHunt()(可被重写)。
- Dog 重写
doHunt()实现追击逻辑 - Cat 重写
afterHunt()添加舔毛动作 - 行为扩展发生在编译期结构里,运行时自动生效,逻辑清晰、调试友好
用组合 + 策略模式注入行为变体
把变化的行为封装成独立类,子类在构造或运行时选择使用哪个策略。例如:
-
Dog内部持有HuntingStrategy strategy - 可传入
ChaseStrategy或AmbushStrategy,同一 Dog 实例切换策略即可改变行为 - 不需要新增子类,也不需修改 Dog 类,扩展性更强、职责更内聚
利用工厂或构建器返回适配后的实例
外部不直接 new 子类,而是通过配置或条件触发创建带特定扩展行为的对象。
-
AnimalFactory.create("dog", "fetcher-enabled")返回启用拾取能力的 Dog -
Dog.builder().withFetcher().build()构造增强版实例 - 使用者仍只面对
Animal引用,调用统一,扩展行为全部封装在创建环节
这些做法共同特点是:不依赖并发、不修改类结构、所有路径静态可读、状态确定。真正体现“面向接口编程”和“开闭原则”。多态的价值,正在于让你写一次通用逻辑(比如遍历 List<animal></animal> 并调用 makeSound()),就能自然适配未来所有新子类。











