【JavaSE】类与类的关系--UML

类(对象/接口)之间的关系 -- UML类图展现


2019-07-14  14:37:19  by冲冲

在面向对象程序设计时,类与类之间的关系主要分为:继承,实现,依赖,关联,聚合,组合等6种关系。

各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚集 > 关联 > 依赖 其中前两种理解很简单,重点是比较容易混淆的后四种。

1. 继承 -- "a is kind of A"

继承(Generalization):亦称泛化,表示一般与特殊的关系。继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加自己的新功能。

【箭头指向】带三角箭头的实线,箭头指向父类。

                               

1 class Athlete {...}
2 class BallAthlete extends Athlete {...}
3 class FootBallAthlete extends BallAthlete {...}
4 
5 interface Action {...}
6 interface Speak extends Action {...}

2. 实现 -- "A realize Ia,Ib..."

实现(realization):指的是一个class类实现interface接口(可以是多个)的功能。

【箭头指向】带三角箭头的虚线,箭头指向接口。

 

1 interface Speak {...}
2 interface Run {...}
3 interface Jump {...}
4 
5 class Athlete implements Speak,Run,Jump {....}

3. 依赖 -- "A use B"

依赖(dependency):指的是类A调用类B。类B的变化会影响到类A,但是类A的变化不会影响到类B。表示一种使用关系,一个类的功能实现需要另一个类协助。

【代码表现】类B是类A的局部变量、类B是类A的方法参数、类A调用类B的静态方法。

【特点】依赖关系具有偶然性,临时性,是比较弱的关系。

【例子】比如,我要过河,需要调用一只船,我和船的关系就是依赖关系。

【箭头指向】带箭头>的虚线,箭头指向被使用者。

1 class Ball {...}
2 
3 class BallAthlete {
4   public void sport(Ball ball){...}
5 }

4. 关联 -- "A has B"

关联(association):指的是类B作为类A的类属性/成员变量。表示一种拥有关系,一个类知道另一个类的属性和方法。

【代码表现】类B是类A的类属性/成员变量。

【特点】关联关系属于强依赖关系,具有强烈性,长期性。

【箭头指向】带箭头>的实线,箭头指向被拥有者。

【多重性关联】关联的两端都存在一个基数,表示该关联类可以有几个实例。0..1表示可以有0或1个实例;0..*表示对实例的数目没有限制;1表示只能有一个实例;1..*表示至少有一个实例。

①单向关联--使用单箭头

1 public class BallAthlete {
2     private Price price;
3     ......
4 }
5 
6 public class Price {
7     ......
8 }

②双向关联--使用双箭头或者不使用箭头 

   

1 public class Teacher {
2     private Student students[];
3     ......
4 }
5 
6 public class Student {
7     private Teacher teachers[];
8     ......
9 }

③自身关联--使用单箭头,构成自回路

特点:类的属性对象类型为该类本身。

1 public class Node {
2     private Node subNode;
3     ……
4 }

5. 聚合 -- "A has B"

聚合(Aggregation):表示整体与部分的关系,部分可以离开整体单独存在。

【代码表现】类B是类A的类属性/成员变量。

【特点】聚合关系属于关联关系的一种,但是比关联关系更强。语法上无法区分聚合关系和关联关系,必须根据具体逻辑区分。

【例子】车和车轮是整体与部分的关系,但是车轮离开车还是可以独立存在的。

【箭头指向】带空心菱形的实线,菱形指向整体。

 1 public class Car {
 2     private Engine engine;
 3 
 4     //构造注入
 5     public Car(Engine engine) {
 6         this.engine = engine;
 7     }
 8     
 9     //设值注入
10     public void setEngine(Engine engine) {
11         this.engine = engine;
12     }
13     ……
14 }
15 
16 public class Engine {
17     ……
18 } 

6. 组合 -- "A contains B"

组合(Composition):表示整体与部分的关系,部分不能离开整体单独存在。

【代码表现】类B是类A的类属性/成员变量。

【特点】组合关系属于关联关系的一种,但是比聚合关系更强。它要求普通的聚合关系中代表整体的对象,负责代表部分的对象的生命周期。

【例子】公司和部门是整体和部分的关系,但是没有公司,部门也就不存在。

【箭头指向】带实心菱形的虚线,菱形指向整体。

 1 public class Head {
 2     private Mouth mouth;
 3     public Head() {
 4         mouth = new Mouth(); //实例化成员类
 5     }
 6     ……
 7 }
 8 
 9 public class Mouth {
10     ……
11 } 
原文地址:https://www.cnblogs.com/yadiel-cc/p/11072776.html