通過簡單例子 | 快速理清 UML 中類與類的六大關係

語言: CN / TW / HK

類與類之間的六大關係

  1. 泛化 ( Generalization ) ---> 表繼承關係
  2. 實現 ( Realization )
  3. 關聯 ( Association )
  4. 聚合 ( Aggregation )
  5. 組合 ( Compostion )
  6. 依賴 ( Dependency )

前言:

最近學校在上統一建模語言 UML ,也是畢業設計中需要用到,做個小記錄。

希望這篇文章能夠給大家帶來些許收穫,讓大家趁興而歸。

一、單個類的類圖

一步一步來,我們先學學如何使用 UML 圖來表示單個類。

我先把類貼下面:

package uml;

/**
 * @Author: crush
 * @Date: 2021-09-30 15:00
 * version 1.0
 */
public class Person {

    private String name;
    private Integer age;

    private static String school="某小學";

    public static String nationality="中國";

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public static String getSchool() {
        return school;
    }

    public static void setSchool(String school) {
        Person.school = school;
    }

    public static String getNationality() {
        return nationality;
    }

    public static void setNationality(String nationality) {
        Person.nationality = nationality;
    }

    public void selfIntroduction(String name, Integer age, String school){
        System.out.println("做一個自我介紹,我的名字是:"+name+",今年"+age+"歲了,來自於"+school);
    }
}

這個類還是非常簡單的哈,接下來就是要如何用一個類圖來進行描述呢?

如下圖:

image-20210930155709370

解釋

  1. 上半部分是 Person 類的屬性,下半部分是 Person 類的方法

  2. - name:String 描述的是:private String name;

    -號:表示為私有屬性( private ),反過來 + :就表示 public

    name:為屬性名稱

    :xxx :是表示屬性的型別的。此處為 String 型別

  3. <u>-School:String="某幼兒園"</u> :描述的是 private static String school="某小學";

    <u>下劃線</u>是表示此屬性為 static(靜態屬性)

    "某幼兒園" 表示有預設值。 其他同上。

  4. <u>+ getNationality():String</u> 描述的是

    public static void setNationality(String nationality) {
        Person.nationality = nationality;
    }
    

    和上面基本一樣,+ 表示 public ,下劃線表示 static 修飾,getNationality() 表示方法名,String 表示返回值為String型別。

但是平時中,我們通常都是多個類之間有關係,不是個孤零零的孤寡老人。

二、多個類之間的關係

表達多個類之間的關係有以下六種:

  1. 泛化 ( Generalization ) ---> 表述繼承關係 ( 三角箭頭的實線,箭頭指向父類 )
  2. 實現 ( Realization ) ( 三角箭頭的虛線,箭頭指向介面 )
  3. 關聯 ( Association ) ( 普通箭頭的實心線,指向被擁有者 )
  4. 聚合 ( Aggregation ) ( 空心菱形的實心線,菱形指向整體 )
  5. 組合 ( Compostion ) ( 實心菱形的實線,菱形指向整體)
  6. 依賴 ( Dependency ) ( 箭頭的虛線,指向被使用者 )

image-20210930185554257

三、繼承和實現的類圖

3.1、繼承

【泛化關係】:是一種繼承關係,表示一般與特殊的關係,它指定了子類如何特化父類的所有特徵和行為。例如:老虎是動物的一種,即有老虎的特性也有動物的共性

1)程式碼

動物類:

public class Animal {

    private String name;
    private Integer age;

    public Animal() {
    }
    public Animal(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

貓類繼承動物類:

public class Cat extends Animal {

    private String breeds;

    public Cat(String name, Integer age, String breeds) {
        super(name, age);
        this.breeds = breeds;
    }

    public String getBreeds() {
        return breeds;
    }

    public void setBreeds(String breeds) {
        this.breeds = breeds;
    }

    public void selfIntroduction(String name,Integer age,String breeds){
        System.out.println("我叫"+name+",是一隻"+breeds+"品種的貓,今年"+age+"歲了,");
    }
}

我們用類圖來表示這個關係。

4)圖示

箭頭要用對,不然關係就完全不一樣拉。

image-20210930190030083

3.2、實現

【實現關係】:是一種類與介面的關係,表示類是介面所有特徵和行為的實現.

1) 程式碼

吃睡介面,我們再讓動物類來實現他兩。

public interface Eat {
    void eat();
}
public interface Sleep {
    void sleep();
}
public class Animal implements Eat,Sleep{
    private String name;
    private Integer age;

    public Animal() {
    }

    public Animal(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public void eat() {
        System.out.println("吃東西");
    }

    @Override
    public void sleep() {
        System.out.println("睡覺");
    }
}

2) 圖示

image-20210930190818346

四、關聯關係的類圖

【關聯關係】:是一種擁有的關係,它使一個類知道另一個類的屬性和方法;如:老師與學生,丈夫與妻子關聯可以是雙向的,也可以是單向的。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。

我們增添一個出身地的類,每個動物都會有一個出生地的地方。

我們將這個出生地和動物關聯起來。

4.1、程式碼

/**
 * @Author: crush
 * @Date: 2021-09-30 19:11
 * version 1.0
 * 出生地
 */
public class Birthplace {

    private String birthplace;

    public Birthplace(String birthplace) {
        this.birthplace = birthplace;
    }

    public String getBirthplace() {
        return birthplace;
    }

    public void setBirthplace(String birthplace) {
        this.birthplace = birthplace;
    }
}

與動物類關聯起來:

public class Animal implements Eat,Sleep{

    private String name;
    private Integer age;
    private Birthplace birthplace;

    public Animal() {
    }

    public Animal(String name, Integer age, Birthplace birthplace) {
        this.name = name;
        this.age = age;
        this.birthplace = birthplace;
    }

    public Birthplace getBirthplace() {
        return birthplace;
    }

    public void setBirthplace(Birthplace birthplace) {
        this.birthplace = birthplace;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public void eat() {
        System.out.println("吃東西");
    }

    @Override
    public void sleep() {
        System.out.println("睡覺");
    }
}

在自我介紹方法中增添輸出。

public class Cat extends Animal {

    private String breeds;

    public Cat(String name, Integer age,Birthplace birthplace, String breeds) {
        super(name, age,birthplace);
        this.breeds = breeds;
    }

    public String getBreeds() {
        return breeds;
    }

    public void setBreeds(String breeds) {
        this.breeds = breeds;
    }

    public void selfIntroduction(String name,Integer age,String breeds,Birthplace birthplace){
        System.out.println("我叫"+name+",是一隻"+breeds+"品種的貓,今年"+age+"歲了,出生於"+birthplace.getBirthplace());
    }
}

4.2、圖示

image-20210930192734368

五、聚合和組合關係的類圖

5.1、聚合

聚合 ( Aggregation ) : 是整體與部分的關係,且部分可以離開整體而單獨存在。如車和輪胎是整體和部分的關係,輪胎離開車仍然可以存在。 聚合關係是關聯關係的一種,是強的關聯關係;關聯和聚合在語法上無法區分,必須考察具體的邏輯關係。

先說說我這個例子,我們再寫程式碼。

【例子】每臺車都會有四個輪胎和一個引擎,輪胎離開車可以單獨存在的,引擎同樣也是。

1)程式碼

public class Wheel {
    private String type;

    public Wheel(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void move(){
        System.out.println("滾動!!!");
    }
}
public class Engine {

    private String type;

    public Engine(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void start(){
        System.out.println("啟動引擎!!!");
    }
}

public class Car {

    private Wheel wheel;
    private Engine engine;

    public Car(Wheel wheel, Engine engine) {
        this.wheel = wheel;
        this.engine = engine;
    }

    public Wheel getWheel() {
        return wheel;
    }

    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void go(){
        System.out.println("開車出去浪;啊");
    }
}

用類圖如何表示勒,接著往下看👇

2)圖示

image-20210930210032868

5.2、組合

組合 ( Composition ) : 是整體與部分的關係,但部分不能離開整體而單獨存在。如公司和部門是整體和部分的關係,沒有公司就不存在部門。還有如人由頭和身體組成,沒有了人,頭和身體還咋存在勒。 組合關係是關聯關係的一種,是比聚合關係還要強的關係,它要求普通的聚合關係中代表整體的物件負責代表部分的物件的生命週期。

1)程式碼

public class Body {

    private double size;

    public Body(double size) {
        this.size = size;
    }

    public double getSize() {
        return size;
    }

    public void setSize(double size) {
        this.size = size;
    }
}
public class Head {

    private double size;

    public Head(double size) {
        this.size = size;
    }

    public double getType() {
        return size;
    }

    public void setType(double size) {
        this.size = size;
    }
}
public class Person2 {
    private String name;
    private Head head;
    private Body body;

    public Person2(String name, Head head, Body body) {
        this.name = name;
        this.head = head;
        this.body = body;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Head getHead() {
        return head;
    }

    public void setHead(Head head) {
        this.head = head;
    }

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body = body;
    }

    public void say(){
        System.out.println("我會說話");
    }
}

2)圖示

image.png

六、依賴關係的類圖

依賴(Dependency): 關係是一種使用關係,它是物件之間耦合度最弱的一種關聯方式,是臨時性的關聯。在程式碼中,某個類的方法通過區域性變數、方法的引數或者對靜態方法的呼叫來訪問另一個類(被依賴類)中的某些方法來完成一些職責。

在 UML 類圖中,依賴關係使用帶箭頭的虛線來表示,箭頭從使用類指向被依賴的類。如人與手機的關係圖,人通過手機的語音傳送方法打電話。

1、程式碼

public class Phone {
    public void callUp(){
        System.out.println("與人通話");
    }
}
public class Person3 {

    private String name;

    public Person3(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void callUp(Phone phone){
        System.out.println("使用手機打電話");
        phone.callUp();
    }
//    下面這種方式也是依賴關係
//    public void callUp(){
//        Phone phone=new Phone();
//        System.out.println("使用手機打電話");
//        phone.callUp();
//    }
}

2、圖示

image-20210930215917034

七、類關係的強弱

強弱關係:泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴

另外我們常常說的降低耦合性,也是降低類與類之間的關係。

八、自言自語

今天的文章就到這裡了。

如若在文章中遇到疑惑,請留言或私信,或者加主頁聯絡方式,都會盡快回復。

如若發現文章中存在問題,望你能夠指正,不勝感謝。

如果覺得對你有所幫助的話,請點個贊再走吧!.

知乎 | 寧在春

簡書 | 寧在春

CSDN | 寧在春

掘金 | 寧在春

部落格園 | 寧在春