OOP中类的交互关系 - 图1

  • OOP中类之间的关系表现为:在本类中持有其他类的引用。
    • Java中,继承是隐式的,代表 is-a关系,其他是显式的,代表 has-a 关系。
  • 依赖是临时”使用”,关联是永久”拥有”。

    泛化(Generalization)

    Java中可以简单理解为继承关系,通过extends关键字实现。

实现(Realization)

一般是指接口和实现类之间的关系,Java中通过implements关键字实现。

关联(Association)

关联关系强调部分与整体的静态关系,具体到代码层面,即 B 类对象是 A 类的成员变量,那 B 类和 A类就是关联关系。可以通过构造或方法进行关联。

一般分为三类

  • 单向关联

A类或B类仅一方成员变量持有对方的对象;

  • 双向关联

A类和B类的成员变量互相持有对方的对象;

  • 自然关联

本类自己成员变量持有自己的对象;

按被关联者生命周期分为

  • 聚合(弱关联),如:学生与班级
  • 组合(强关联),如:大雁与翅膀

聚合(Aggregation)

是一种包含关系,A 类对象持有 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,也就是说可以单独销毁 A 类对象而不影响 B 对象,即,B类对象是从外部传入。比如课程与学生之间的关系。

  1. public class A{
  2. private B b;
  3. public A(B b){
  4. this.b = b;
  5. }
  6. }

组合(Composition)

也是一种包含关系。A 类对象包含 B 类对象,B 类对象的生命周期依赖 A 类对象的生命周期,B 类对象不可单独存在,即,B类对象是由内部创建。比如鸟与翅膀之间的关系。

  1. public class A{
  2. private B b;
  3. public A(){
  4. this.b = new B();
  5. }
  6. }

依赖(Dependency)

依赖是一个对象在运行期间会用到另一个对象的关系。是一种临时性的关系,是一种比关联关系更加弱的关系。如:人开车。在代码中体现为被依赖对象不被依赖对象的成员变量持有。

动态依赖

即 动态依赖的被依赖对象是通过外部传入

  1. public class A{
  2. public void fun(B b){...}
  3. }

静态依赖

即,静态依赖的被依赖对象是通过内部创建,或者静态方法的直接调用

  1. public class A{
  2. public void fun(){
  3. B b = new B();
  4. System.out.print("b");
  5. }
  6. }

说明
动态、静态依赖是我自己进行的分类,因为貌似官方是将 动态依赖 = 依赖,并未对静态依赖的情况进行考虑,但是这却是实际存在的不同情况,所以我觉得应该要区分。
静态依赖这也是一种临时性的关系,只不过是静态的临时性关系,找了很多资料都没有找到UML中有对该情况的说明和解释,目前看来与之最接近的应该依赖关系了,那暂时没有更好的方案,我就叫他静态依赖关系吧,也用依赖关系表示。