![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/52b6c5b4b26a40bf88dd85a54a441ef0~tplv-k3u1fbpfcp-watermark.image) 玩轉設計模式 - 看懂UML類圖 ================ 前言 -- 作為設計模式系列的第一篇,我準備先分享下如何看懂UML類圖,看完這篇文章,你就能看懂類圖中各個類之間的關係以及線條、箭頭都代表什麼意思。 同時,我們會將類圖所表達的含義和最終的代碼實現對應起來; 有了這些知識,看後面章節的設計模式結構圖就沒有什麼問題了。 先看一個例子 ------ 下面是我畫的一張類圖,使用的工具是StarUML,Mac版本[下載地址](https://macwk.com/soft/staruml) ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/63e4f3342c734005bff326e52adf45c7~tplv-k3u1fbpfcp-watermark.image) - 數碼是斜體的,表示數碼是一個抽象類 - 數碼有兩個繼承類,分別是手機和電腦,他們之間的關係是**實現**關係,用帶空心箭頭的虛線表示 - iPhone與手機之間也是繼承關係,他們之間的關係是**泛化**關係,用帶空心箭頭的實線表示 - 手機由屏幕和主板等組合而成,他們之間的關係是**組合**關係,用帶實心菱形的實線表示 - 程序員上班必須要用電腦,他們之間的關係是**依賴**關係,用帶箭頭的虛線表示 - 程序員與公司之間是**聚合**關係,用帶空心菱形的實線表示 - 程序員一般都會有自己的工牌,他們之間的關係是**關聯**關係,用實線表示 以上例子和圖中我都把類的六種關係特別標註出來了,下面我們具體講講這六種關係 類之間的關係 ------ 類的繼承結構表現在UML中為:**實現**和**泛化** 繼承關係為 is-a的關係;兩個對象之間如果可以用 is-a 來表示,就是繼承關係 ### 實現(Realization) “數碼”是一個抽象概念,在現實中並不能直接用來定義對象,必須指明它的子類,比如手機和電腦。“數碼”這個類在java中可以用接口或者抽象類表示,在C++中用抽象類表示。 代碼實現:實現關係表現為繼承抽象類。 ### 泛化(Generalization) 手機在現實中有實現,可以用來定義具體的對象,iphone是手機的子類,手機和iphone的關係為泛化關係。 代碼實現:泛化關係表現為繼承非抽象類。 ### 聚合(Aggregation) 聚合表示兩個對象之間是整體和部分的**弱關係,生命週期不同步**,部分的生命週期可以超越整體,比如程序員和公司,公司倒閉了,但程序員還在,還可以去其他公司。 代碼實現:聚合關係以**成員變量**的形式實現,只是成員變量的賦值時機是在**類方法**裡,代碼如下: ```java //第一種是在set方法裡直接設置子類的實例 class Company { private Programmer programmer; public void setProgrammer(JavaProgrammer javaProgrammer) { programmer = javaProgrammer; } } //第二種方式是在set方法裡直接寫死,直接定義一個初始值 class Company { private Programmer programmer; public void setProgrammer() { programmer = new JavaProgrammer(); } } 複製代碼 ``` ### 組合(Composition) 組合表示兩個對象之間是整體和部分的**強關係,生命週期一致**,部分的生命週期不能超越整體,或者說組合中的整體不能缺少部分。就像手機不能缺少屏幕和主板一樣。 代碼實現:組合關係以**成員變量**的形式實現,只是成員變量的賦值時機是在**類構造方法**裡,代碼如下: ```java //手機由屏幕組成 class Phone { private Screen screen; //創建手機的時候同時創建屏幕 public Phone() { screen = new Screen(); } } 複製代碼 ``` ### 關聯(Association) 關聯表示的是兩個不同對象之間存在的固定的對應關係,**它是一種靜態關係,和運行狀態無關**。 代碼實現:關聯關係也是以成員變量的形式實現,只是成員變量的賦值時機是在聲明這個變量的時候,代碼如下: ```java //程序員都會有工牌 class Programmer { private Card card = new Card(); } 複製代碼 ``` ### 依賴(Dependency) 依賴表示的是**一個對象在運行期間會用到另一個對象的關係**,與關聯關係不同的是,它是一種臨時性的關係,通常在**運行期間**產生,並且隨著運行時的變化,依賴關係也可能發生變化。比如程序員在工作的時候會用到電腦,程序員是依賴電腦的。 代碼實現:依賴關係主要可以通過**方法參數、方法局部變量、靜態方法**三種方式實現,方法參數代碼如下: ```java class Programmer { //程序員工作的時候需要用到電腦 public void work(Computer computer) { computer.work(); } } 複製代碼 ``` 總結 -- ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e419db264b724e899767abb2adb5aed9~tplv-k3u1fbpfcp-watermark.image) ----- - [玩轉設計模式 - 看懂UML類圖](https://juejin.cn/post/6914946238756421639)