UML 基本介紹
- UML(統一模組化語言),是一種用于軟體系統分析和設計的語言工具,它用于幫助軟體開發人員進行思考和記錄思路的結果
- UML本身是一套符号的規定, 就像數學符号和化學符号一樣,這些符号用于描述軟體模型中的各個元素和他們之間的關系,比如
- 類
- 接口
- 實作
- 泛化(繼承)
- 依賴
- 組合
- 聚合
- 等

- 使用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 |
靜态結構圖 | 類圖, 對象圖, 包圖, 元件圖, 部署圖 |
動态行為圖 | 互動圖(時序圖與協作圖), 狀态圖, 活動圖 |
說明:
- 類圖是描述類與類之間的關系, 是UML 圖中最核心的, 同樣也是設計模式中的核心
UML 類圖
基本介紹
- 用于描述系統中的類(對象)本身的組成和類(對象)之間的各種靜态關系
- 類之間的關系:依賴, 繼承, 實作, 關聯, 聚合 和 組合
示例
代碼形式
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了
小結
- 類中用到了對方
- 如果是類的成員屬性
- 如果是方法的傳回類型
- 如果是方法接收的參數類型
- 方法中有使用到
泛化(繼承)關系
泛化其實就是繼承, 是依賴關系的一種特殊情況
代碼
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的圖)
小結
- 泛化就是繼承
- 我感覺這個名詞絕對是個坑, 繼承就繼承白, 還泛化, 面試的時候肯定會有點蒙
實作關系
就是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{}