02-設計模式 UML類圖
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{}
類圖
組合採用實線-實心菱形表示