image

编辑人: 流年絮语

calendar2025-09-18

message6

visits81

强化阶段第 45 - 46 周:合成复用原则之代码复用与继承滥用修复

在系统架构设计师的备考过程中,面向对象设计原则是非常重要的一部分,其中合成复用原则更是关键考点。本文将重点讲解如何通过组合(Has - A)而非继承(Is - A)实现代码复用,并总结继承滥用(脆弱性)修复案例。

一、组合(Has - A)与代码复用

  1. 组合的概念
  • 组合是一种对象之间的关系,表示一个对象包含另一个对象。例如,在一个汽车类中包含一个发动机类对象。这种关系体现了“有一个”的概念。
  • 学习方法:可以通过实际生活中的例子来理解,像电脑类包含CPU类、内存类等组件。绘制类图来直观展示这种关系也是很好的学习手段。
  1. 组合实现代码复用的优势
  • 灵活性高。当需要改变组成部分的行为或者类型时,不需要修改包含该部分的类的代码。比如,如果汽车要从燃油发动机换成电动发动机,只需要创建一个新的电动发动机类,然后在汽车类中替换掉原来的发动机对象即可。
  • 降低耦合度。组合使得各个类之间的依赖关系更加松散。不同的组合可以创建出不同功能的整体对象,而不会影响到其他部分的代码。

二、继承(Is - A)与继承滥用

  1. 继承的概念
  • 继承是一种表示“是一个”关系的机制。例如,轿车是一个汽车,所以轿车类可以继承汽车类。
  1. 继承滥用的表现及危害(脆弱性)
  • 表现:
    • 过度使用继承层次结构。比如创建非常深的继承树,导致类的关系变得复杂难以理解。
    • 不恰当的继承关系。例如,正方形和矩形的关系,如果简单地让正方形继承矩形可能会导致问题,因为正方形的边长相等这一特性在某些操作下会与矩形的行为冲突。
  • 危害:
    • 继承层次过深会使代码的维护成本增加。一旦父类发生变化,可能会导致很多子类都需要修改。
    • 不恰当的继承关系会使代码的可扩展性变差,容易引入新的错误。

三、继承滥用修复案例

  1. 案例一:图形类层次结构
  • 问题:在一个图形绘制系统中,最初有形状类作为父类,圆形、矩形、三角形等作为子类。但是后来需要添加一些特殊形状,如可变形的圆形,它既有圆形的部分特性又有可变形的特性。
  • 解决方案:不再单纯依靠继承,而是在圆形类中组合一个可变形组件。这样既保留了圆形的基本特性,又可以灵活地添加新的功能。
  1. 案例二:动物类层次结构
  • 问题:动物类下有哺乳动物、鸟类等子类,鸟类中有鸵鸟这种不会飞的鸟。如果按照传统的继承逻辑,在飞行相关的行为上会出现矛盾。
  • 解决方案:对于飞行行为,可以采用组合的方式。创建一个飞行能力类,然后在需要飞行的鸟类子类中组合这个飞行能力类,而鸵鸟类则不组合这个类,而是定义自己的行为。

总之,在面向对象设计中,要谨慎使用继承,更多地利用组合来实现代码复用,这有助于提高系统的灵活性、可维护性和可扩展性。这也是系统架构设计师在实际项目中需要遵循的重要原则,在备考过程中需要深入理解和掌握。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:强化阶段第 45 - 46 周:合成复用原则之代码复用与继承滥用修复

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share