1. 程式人生 > 其它 >02-設計模式 UML類圖

02-設計模式 UML類圖

UML 基本介紹

  1. UML(統一建模語言),是一種用於軟體系統分析和設計的語言工具,它用於幫助軟體開發人員進行思考和記錄思路的結果
  2. UML本身是一套符號的規定, 就像數學符號和化學符號一樣,這些符號用於描述軟體模型中的各個元素和他們之間的關係,比如
    1. 介面
    2. 實現
    3. 泛化(繼承)
    4. 依賴
    5. 組合
    6. 聚合
  1. 使用UML來建模,常用的工具有Rational Rose, 也可以用一些外掛來建模

UML建模外掛(Eclipse版)

自行參考老師的建模工具

UML建模外掛(IDEA版)

因為現在開發中大多數都是使用的IDEA,雖然視訊中使用的是Eclipse, 但是我還是使用IDEA來寫

在這個給大家推薦一個很好用的UML外掛

安裝PlantUML

https://www.yuque.com/jieshou-r0wj4/gtydap/me3gmz

安裝直接參考連結安裝就可以,我單獨寫了一篇,就不在這裡再寫了

這個外掛功能非常強大,不止可以用來畫類圖和根據類直接解析成圖還可以畫

我們這裡只說Class 類圖

符號,關係

參考官網 類圖符號

https://plantuml.com/zh/class-diagram

我這裡只寫一下關係符號

語法

描述

樣式

(--)代表直線(..)代表虛線

關係描述

圖樣式

A --|> B

繼承

A ..|> B

實現

A ..> B

依賴

A --> B

關聯

A --o B

聚合

A --* B

組合

其他語法直接看上面的連結, 裡面有詳細寫 語法

UML 圖

畫圖其實和寫文章差不多,都是把自己的思想描述表達出來,關鍵是在於思路和條理

分類

用例圖

use case

靜態結構圖

類圖, 物件圖, 包圖, 元件圖, 部署圖

動態行為圖

互動圖(時序圖與協作圖), 狀態圖, 活動圖

說明:

  1. 類圖是描述類與類之間的關係, 是UML 圖中最核心的, 同樣也是設計模式中的核心

UML 類圖

基本介紹

  1. 用於描述系統中的類(物件)本身的組成和類(物件)之間的各種靜態關係
  2. 類之間的關係: 依賴, 繼承, 實現, 關聯, 聚合 和 組合

示例

程式碼形式

package com.dance.design.uml.demo;

public class Person {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

在這裡教一個小技巧, 我們寫完程式碼後不需要手動去畫類圖,可以直接使用PlantUML Parser解析出來

在類上點選

起一個名字點選生成,就可以得到類圖了

是不是非常Nice

依賴關係

只要是在類中用到了對方, 那麼他們之間就存在依賴關係,如果沒有對方,編譯都通不過

程式碼

package com.dance.design.uml.dep;

public class PersonServiceBean {
    private PersonDao personDao;

    public void savePerson(Person person){}

    public IDCard getIDCard(Integer personId){ return new IDCard(); }

    public void modify(){
        Department department = new Department();
    }
}
class PersonDao{}
class IDCard{}
class Person{}
class Department{}

類圖

這個生成出來只有類圖,沒有依賴關係, 自己去寫關係,通過上面說的符號,關係

我這裡寫一遍後面就直接貼圖了

@startuml
class com.dance.design.uml.dep.PersonServiceBean {
- PersonDao personDao
+ void savePerson(Person)
+ IDCard getIDCard(Integer)
+ void modify()
}
class com.dance.design.uml.dep.PersonDao {
}
class com.dance.design.uml.dep.IDCard {
}
class com.dance.design.uml.dep.Person {
}
class com.dance.design.uml.dep.Department {
}
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.PersonDao
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.IDCard
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Person
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Department
@enduml

OK了

小結

  1. 類中用到了對方
  2. 如果是類的成員屬性
  3. 如果是方法的返回型別
  4. 如果是方法接收的引數型別
  5. 方法中有使用到

泛化(繼承)關係

泛化其實就是繼承, 是依賴關係的一種特殊情況

程式碼

package com.dance.design.uml.ext;

public abstract class AbstractPerson {
    public void save(){}

    public void delete(){}
}
class Person extends AbstractPerson{
    
}

類圖

剛才在點選IDEA的時候發現IDEA其實預設是帶了Diagrams這個類圖外掛的,這個也挺好用的直接就能顯示,但是好像不能修改,但是可以控制方法,構造,介面這些是不是展示,感覺也挺好的, 有喜歡的可以去試試, 這裡我們還是用PlantUML吧

哦~原來繼承關係是可以自動解析出來的, 但是依賴就不行了

然後又回去看了看 Diagrams 發現居然可以展示依賴關係,上面有個小按鈕, 還有組合關係居然也顯示出來了, 而且也能編輯修改,突然感覺PlantUML不香了

而且還可以控制是否展示方法,啥的

emm, 我們還是以PlantUML來寫吧, 工作中自然是哪個好用 用哪個(然後我在後面其實都貼了Diagrams的圖)

小結

  1. 泛化就是繼承
  2. 我感覺這個名詞絕對是個坑, 繼承就繼承白, 還泛化, 面試的時候肯定會有點蒙

實現關係

就是A類實現了B介面, 其實也是依賴的一種特殊情況

程式碼

package com.dance.design.uml.impl;

public interface PersonService {
    void save();
}
class PersonServiceImpl implements PersonService{
    @Override
    public void save() {
        System.out.println("實現");
    }
}

類圖

沒錯, 我貼上了Diagrams的圖

但是突然發現兩個一起使用會更好,如果是單個類檔案的話,Diagrams會更好, 但是如果是包的話PlantUML會更好

有對比才有傷害

感覺PlantUML有點不好,就是在解析的時候不解析依賴關係, 其他的都很好,哎後面還是用PlantUML吧(渣男本難)

小結

實現關係其實 沒什麼好說的,這個是在開發中最常用的 介面+impl

關聯關係

關聯關係其實就是類與類之間的關聯

常見的關聯關係其實就是表設計時候的關係

關係

描述

1 對 1

一個人 一張身份證

1 對 多

一個公司下好多部門

多 對 多

一個部門下好多人, 一個人又存在於多個部門

關聯具有導航性, 就是方向 1 -> 1 是單向的 如果是 1 <-> 1就是雙向的

關係具有多重性

  • 1 表示有且僅有1個
  • 0... 表示0個或多個
  • 0,1 表示0個或者1個
  • n...m 表示n個到m個都可以
  • m...* 表示至少m個

一對一

程式碼

package com.dance.design.uml.gl.onevone;

public class Person {
    /**
     * 身份證
     */
    private IDCard idCard;
}
class IDCard{}

類圖

一對多

程式碼

package com.dance.design.uml.gl.onevduo;

import java.util.List;

public class Gx {
    /**
     * 多部門
     */
    private List<Department> departments;
}
class Department{}

類圖

多對多

程式碼

package com.dance.design.uml.gl.duovduo;

import java.util.List;

public class Person {
    private List<Department> departments;
}
class Department{
    private List<Person> personList;    
}

當然開發中不會這麼寫,一般都會用中間表,這裡只是寫樣例

類圖

聚合關係

基本介紹

聚合關係表示的是整體和部分的關係, 整體和部分可以分開, 聚合關係是關聯關係的特例, 所以他具有關聯的導航性和多重性

一臺電腦由鍵盤, 顯示器, 滑鼠等部件組成; 組成電腦的各個配件是可以從電腦上分離出來的, 使用實線-空心菱形表示

程式碼

package com.dance.design.uml.gl.jh;

public class Computer {
    public Mouse mouse;
    public Keyword keyword;
    public View view;
}
class Mouse{}
class Keyword{}
class View{}

類圖

組合關係

基本介紹

組合關係: 也是整體與部分的關係, 但是整體和部分不可以分開

在我們看來, 桌上型電腦, 滑鼠和鍵盤和顯示器, 都是可以從主機上分離的, 所以他們是聚合關係, 但是如果是筆記本的話,顯然自帶鍵盤, 顯示器都是不可分離的, 只有滑鼠可以分離(觸控板不可以), 這時顯示器和電腦是組合關係,鍵盤和電腦是組合關係, 滑鼠和電腦是聚合關係

程式碼

package com.dance.design.uml.gl.jh;

public class Computer {
    public Mouse mouse;
    private Keyword keyword = new Keyword();
    private View view = new View();
}
class Mouse{}
class Keyword{}
class View{}

類圖

組合採用實線-實心菱形表示