多态是运行时行为分发机制,通过接口抽象、模板方法、组合策略及工厂创建实现可插拔扩展,无需修改原有代码,符合开闭原则。

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

















