Java 面向对象设计中类之间的关系

197 阅读4分钟

Java 面向对象设计中类之间的关系

  • 在面向对象设计时,梳理各个类之间的关系概念,表示类之间存在多种关系包括继承、实现、依赖、关联、聚合和组合,有助于实现代码的复用和模块化以构建灵活、可维护和可扩展的系统,同样也使代码在结构上更加清晰易于理解

Inheritance 继承

  • 也称为 Generalization 泛化
  • 继承关系是一种类与类之间基于层次结构的关系,允许一个子类(派生类)继承父类(基类)的属性和方法,子类可以复用父类的代码并且可以对继承的内容进行扩展或者重写,是一种 “is-a” 的关系,意味着子类是一个更具体的父类
  • 在 Java 中用 extends 关键字来继承父类
  • 在 UML 图中继承关系用空心三角箭头的实线表示,箭头从子类指向父类,代表子类继承父类

Implementation 实现

  • 也称为 Realization 实现
  • 实现关系主要用于接口和实现类之间,接口定义了一组抽象的方法签名(方法的声明,没有具体的实现内容),而实现类负责去具体实现这些抽象方法,以此来表明实现类遵循了接口所规定的行为契约,是一种 “like-a” 的关系,意味着实现类像一个接口(实现类还包含额外其他的方法,所以不完全一样)
  • 在 Java 中用 implements 关键字来实现接口
  • 在 UML 图中实现关系用空心三角箭头的虚线表示,箭头从实现类指向接口,代表实现类实现接口

Dependency 依赖

  • 依赖关系是一种临时性、相对松散的关系,表示联系并不紧密,是一种 “use-a” 的关系
  • 在 Java 中依赖关系表现为一个类使用了另一个类来实现自己的功能,多体现在一个类通过参数传入、局部变量声明、返回类型、静态方法或者通过实例化另一个类来创建对象等方式依赖使用另一个类,不涉及类属性层面长期的关联
  • 在 UML 图中用带箭头的虚线表示,箭头从依赖类指向被依赖类

Association 关联

  • 关联是一种相对持久、稳定的关系,关联关系比依赖关系要强,这种关系可以是单向的也可以是双向的
  • 在 Java 中关联关系通常通过成员变量来实现,比如一个类中定义了另一个类的对象作为其属性,这可以是单对象形式,也可以是对象集合的形式
  • 在 UML 图中用实线表示,如果是单向关联则在实线一端添加箭头表明方向,如果是双向关联则两端都有箭头(或者两端无箭头)

Aggregation 聚合

  • 聚合关系是一种特殊的关联关系(关联关系的一种特殊形式),是一种弱的 “整体-部分” 关系,体现的是整体与部分之间的关系,并且部分可以脱离整体而单独存在,部分类可以在多个整体类中使用,整体类不负责管理部分类的生命周期,是一种 “has-a” 的弱拥有关系
  • 在 Java 中聚合关系通常表现为一个类包含另一个类的引用作为成员变量,并通过构造方法、普通方法或 setter 方法传入这个成员对象
  • 在 UML 图中通过带空心菱形和箭头的实线表示,空心菱形端靠近代表整体的类,箭头指向代表部分的类

Composition 组合

  • 组合关系也是一种特殊的关联关系(也可以说是聚合关系的一种特殊形式),同样也表示整体与部分之间的关系,是一种强的 “整体-部分” 关系,体现的是部分紧紧围绕着整体存在的关系,部分不可以脱离整体而单独存在 ,整体类负责管理部分类的生命周期(当整体类被销毁时部分类也会被销毁),是一种 “contains-a” 的强拥有(包含)关系
  • 在 Java 中组合关系通常表现为一个类包含另一个类的引用作为成员变量,并通过构造方法内部直接实例化创建这个成员对象
  • 在 UML 图中通过带实心菱形和箭头的实线来表示,实心菱形端靠近代表整体的类,箭头指向代表部分的类

总结

  • 依赖关系是类之间最弱的一种关系,从弱到强依次为:依赖 -> 关联 -> 聚合 -> 组合,耦合程度逐渐增强
  • 聚合关系中的成员对象通常可以被外部访问和修改而组合关系中的成员对象通常是被封装在整体对象内部,外部不能直接访问和修改