架构风格与模式58 条

组合优于继承

优先通过对象组合与委托复用行为,而非继承:继承在编译期绑定、破坏封装且层级僵化;当类型关系稳定且确实存在 is-a 语义时才考虑继承。

对比

维度继承组合
绑定时机编译期运行期可替换
封装子类依赖父类实现细节只依赖被组合对象的接口
变化影响父类改动波及全部子类替换实现即可
适用稳定且真实的 is-a行为复用与策略变化
GoF 在《设计模式》中即建议优先使用对象组合;策略、装饰器等模式都是这一原则的体现。

易错点

  • 继承层级超过三层后,改动一个父类方法影响面难以评估
  • 为复用代码而继承(而非语义关系),出现大量不适用的父类方法

数据来源与参考

  • Gamma et al.《Design Patterns》(1994)
  • 《The Pragmatic Programmer》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌