UML中的关系

UML中的关系

关联与依赖之间是按类之间关系的紧密程度而划分的。

关系强度

依赖 <<< 关联 <<< 聚合 <<< 組合 <<< 继承 <<< 实现

1 依赖(Dependence)

定义:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的临时性的非常弱的,但是B类的变化会影响到A。在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数方法中的局部变量、或者静态方法调用

上面的图例中:Bird类依赖于Air类和Food类,Air类和Food类是作为类中方法的参数形式出现在Bird类中的。

代码样例

public class Bird{
    public void breath(Air air){
        System.out.println("呼吸的是:"+ air.getName());
    }
    public void eat(Food food){
        System.out.println("吃的是:"+ food.getName());
    }
}

单向依赖

2 关联(Association)

定义:对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
关联关系分为单向关联和双向关联,在java中,

  1. 单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量;
  2. 双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。

注: 双向关联 时箭头可以省略

单向关联

双向关联

自关联

多重性关联

关联有两个端点, 在每个端点可以有一个基数, 表示这个关联的类可以有几个实例。

表示方式多重性说明
1..1表示另一个类的一个对象只与该类的一个对象有关系
0..*表示另一个类的一个对象与该类的零个或多个对象有关系
1..*表示另一个类的一个对象与该类的一个或多个对象有关系
0..1表示另一个类的一个对象没有或只与该类的一个对象有关系
m..n表示另一个类的一个对象与该类最少m,最多n个对象有关系 (m≤n)

关联体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的

3 聚合(Aggregation)

聚合关系是关联关系的一种,耦合度强于关联,代码表现形式相同,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
在java 中聚合关系也是使用实例变量实现的,从java 语法上是分不出关联和聚合的,关联和聚合的区别纯粹是概念上的,而且严格反映在语义上

代码样例

public class Humanity{
    Car car;
    House house; 
    //聚合关系中作为成员变量的类一般使用set方法赋值
     public void setCar(Car car){
        This.car = car;
    }
    public void setHouse(House house){
        This.house = house;
    }
 
    public void driver(){
        System.out.println("我开的是 "+car.getType()+" 车。");
    }
    public void sleep(){
        System.out.println("我在地址是 "+house.getAddress()+" 的房子里睡大觉");
    }
}

4 组合(Composition)

相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,即contains-a,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。

People与Soul、Body之间是组合关系,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。

代码样例

public class Humanity{
    Soul soul;
    Body body; 
    //组合关系中的成员变量一般会在构造方法中赋值
     public Humanity(Soul soul, Body body){ 
        This.soul = soul;
        This.body = body;
    }
 
    public void study(){
        System.out.println("学习要用灵魂 "+soul.getName());
    }
    public void eat(){
        System.out.println("吃饭要用身体 "+body.getName());
    }
}

综上:关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

5 继承(Generalization)

继承表示类与类(或者接口与接口)之间的父子关系,即“is-a”。在java中,用关键字extends表示继承关系。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类。

代码样例

class Animal {
    public void eat(){}
    public void sleep(){}
}
class Humanity extends Animal {
    public void study(){}
}

6 实现(Implementation)

表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。UML图例中,实现关系用虚线+空心箭头表示,箭头指向接口。
在java中继承使用extends关键字,实现使用implements关键字。

代码样例

interface Vehicle {
    void move();
}
class Ship implements Vehicle {
    public void move(){}   
}
class Car implements Vehicle {
    public void move(){}   
}
class Bicycle implements Vehicle {
    public void move(){}   
}

参考
设计模式中类的关系——卡奴达摩的专栏
设计模式之UML(一)类图以及类间关系——xingjiarong

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22