Java設(shè)計(jì)模式UML之類圖精解
1.UML基本介紹
- UML——Unified modeling language UML (統(tǒng)一建模語言),是一種用于軟件系統(tǒng)分析和設(shè)計(jì)的語言工具,它用于幫助軟件開發(fā)人員進(jìn)行思考和記錄思路的結(jié)果。
- UML本身是一套符號的規(guī)定,就像數(shù)學(xué)符號和化學(xué)符號一樣,這些符號用于描述軟件模型中的各個元素和他們之間的關(guān)系,比如類、接口、實(shí)現(xiàn)、泛化、依賴、組合、聚合等,如下圖:
上面的截圖就是一個UML類圖的案例,只不過這是在eclipse中的,下面的類圖我會在IDEA中使用。
畫UML圖與寫文章差不多,都是把自己的思想描述給別人看,關(guān)鍵在于思路和條理,UML圖分類:??????
- 用例圖 (use case)
- 靜態(tài)結(jié)構(gòu)圖:? 類圖、對象圖、包圖、組件圖、部署圖
- 動態(tài)行為圖:? 交互圖(時序圖與協(xié)作圖)、狀態(tài)圖、活動圖
類圖是描述類與類之間的關(guān)系的,是UML圖中最核心的。
2.UML類圖
用于描述系統(tǒng)中的類(對象)本身的組成和類(對象)之間的各種靜態(tài)關(guān)系。
類之間的關(guān)系:? 依賴、泛化(繼承)、實(shí)現(xiàn)、關(guān)聯(lián)、聚合與組合。
2.1 類關(guān)系——依賴
只要是在類中用到了對方,那么他們之間就存在依賴關(guān)系。?? 來看下面的代碼
package com.szh.uml.dependence; public class PersonServiceBean { private PersonDao personDao; public void save(Person person) { } public IDCard getIDCard(Integer personId) { return null; } public void modify() { Department department = new Department(); } }
package com.szh.uml.dependence; public class PersonDao { }
package com.szh.uml.dependence; public class Person { }
package com.szh.uml.dependence; public class IDCard { }
package com.szh.uml.dependence; public class Department { }
上面的代碼中,PersonServiceBean類中用到了Department、Person等這幾個類,那么我們就可以說PersonServiceBean類與它們幾個類之間存在依賴關(guān)系。
- 類中用到了對方
- 類的成員屬性
- 方法的返回類型
- 方法接收的參數(shù)類型
- 方法體內(nèi)部使用到
依賴的符號就是 虛線 + 一個箭頭。
2.2 類關(guān)系——泛化
泛化實(shí)際上就是繼承,它是依賴關(guān)系的一種特例。
如果A類繼承了B類,那么我們就可以說 A和B 之間存在泛化關(guān)系。
package com.szh.uml.generalization; public abstract class DaoSupport { public void save(Object entity) { } public void delete(Object id) { } }
package com.szh.uml.generalization; public class PersonServiceBean extends DaoSupport { }
繼承就不再多說了,這里需要指出的一點(diǎn)是:IDEA中的泛化符號不太一樣,一般來說,泛化的符號應(yīng)該是 實(shí)線 + 一個空心三角形,而IDEA中則是下圖這樣。
2.3 類關(guān)系——實(shí)現(xiàn)
實(shí)現(xiàn)關(guān)系其實(shí)就是面向接口而言,它和泛化一樣,也是依賴關(guān)系的一種特例。
如果A類實(shí)現(xiàn)了接口B,那么我們就可以說A和B之間存在實(shí)現(xiàn)關(guān)系。
package com.szh.uml.implementation; public interface PersonService { public void delete(Integer id); }
package com.szh.uml.implementation; public class PersonServiceBean implements PersonService{ @Override public void delete(Integer id) { System.out.println("delete.."); } }
實(shí)現(xiàn)接口這個也不再多說了。 這里需要指出的一點(diǎn)是:IDEA中的實(shí)現(xiàn)符號不太一樣,一般來說,實(shí)現(xiàn)的符號應(yīng)該是 虛線 + 一個空心三角形,而IDEA中則是下圖這樣。
2.4 類關(guān)系——關(guān)聯(lián)
關(guān)聯(lián)關(guān)系 實(shí)際上就是類與類之間的聯(lián)系,他是依賴關(guān)系的特例。關(guān)聯(lián)具有導(dǎo)航性:? 即雙向關(guān)系或單向關(guān)系。
關(guān)系具有多重性:? 如“1”(表示有且僅有一個),“0...”(表示0個或者多個),“0,1”(表示0個或者一個),“n.….m”(表示n到 m個都可以), "m.….*”(表示至少m個)
package com.szh.uml.association1; /** * */ public class Person { private IDCard card; }
package com.szh.uml.association1; /** * */ public class IDCard { }
這里我們的理解就是Person類表示人,IDCard類表示身份證類,一個人只有一個身份證號、一個身份證號只屬于一個人,所以它倆之間就存在著一對一的關(guān)聯(lián)關(guān)系。? 關(guān)聯(lián)的符號就是 實(shí)線 + 一個箭頭。
下圖是單向的關(guān)聯(lián)關(guān)系,當(dāng)我們在IDCard類中聲明了Person類的成員變量時,這二者之間的關(guān)聯(lián)關(guān)系就轉(zhuǎn)換成了雙向。(圖中還有組合符號,我們后面會說)
2.5 類關(guān)系——聚合
聚合關(guān)系(Aggregation)表示的是整體和部分的關(guān)系,整體與部分可以分開。聚合關(guān)系是關(guān)聯(lián)關(guān)系的特例,所以他具有關(guān)聯(lián)的導(dǎo)航性與多重性。
如:? 一臺電腦由鍵盤(keyboard)、顯示器(monitor),鼠標(biāo)等組成;組成電腦的各個配件是可以從電腦上分離出來的,使用帶空心菱形的實(shí)線來表示。
package com.szh.uml.aggregation; public class Computer { private Mouse mouse; private Monitor monitor; public void setMouse(Mouse mouse) { this.mouse = mouse; } public void setMonitor(Monitor monitor) { this.monitor = monitor; } }
package com.szh.uml.aggregation; public class Monitor { }
package com.szh.uml.aggregation; public class Mouse { }
聚合的符號一般來說應(yīng)該是 實(shí)線 + 空心菱形,組合的符號則是 實(shí)線 + 實(shí)心菱形,IDEA中聚合、組合的符號都是下圖這樣。
2.6 類關(guān)系——組合
組合關(guān)系:? 也是整體與部分的關(guān)系,但是整體與部分不可以分開。
再看一個案例:在程序中我們定義實(shí)體: Person與IDCard、Head,那么 Head和 Person 就是組合, IDCard 和Person就是聚合。
但是如果在程序中 Person實(shí)體中定義了對IDCard進(jìn)行級聯(lián)刪除,即刪除Person時連同IDCard 一起刪除,那么IDCard和 Person就是組合了。
package com.szh.uml.composition; public class Computer { private Mouse mouse = new Mouse(); private Monitor monitor = new Monitor(); public void setMouse(Mouse mouse) { this.mouse = mouse; } public void setMonitor(Monitor monitor) { this.monitor = monitor; } }
package com.szh.uml.composition; public class Monitor { }
package com.szh.uml.composition; public class Mouse { }
package com.szh.uml.composition; public class Person { private IDCard card; private Head head = new Head(); }
package com.szh.uml.composition; public class Head { }
package com.szh.uml.composition; public class IDCard { }
到此這篇關(guān)于Java設(shè)計(jì)模式UML之類圖精解的文章就介紹到這了,更多相關(guān)Java 設(shè)計(jì)模式類圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中實(shí)現(xiàn)遞歸計(jì)算二進(jìn)制表示中1的個數(shù)
這是一個很有意思的問題,是在面試中特別容易被問到的問題之一,解決這個問題第一想法肯定是一位一位的去判斷,是1計(jì)數(shù)器+1,否則不操作,跳到下一位,十分容易,編程初學(xué)者就可以做得到!2015-05-05spring-boot-maven-plugin 插件的作用詳解
添加了spring-boot-maven-plugin插件后,當(dāng)運(yùn)行maven打包的命令,項(xiàng)目會被打包成一個可以直接運(yùn)行的jar包,使用"java -jar"可以直接運(yùn)行。這篇文章主要給大家介紹spring-boot-maven-plugin 插件的作用,感興趣的朋友一起看看吧2018-10-10使用Java 壓縮文件打包tar.gz 包的詳細(xì)教程
本文帶領(lǐng)大家學(xué)習(xí)如何使用Java 壓縮文件打包tar.gz 包,主要通過 Apache compress 工具打包,通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2021-05-05Java API方式調(diào)用Kafka各種協(xié)議的方法
本篇文章主要介紹了Java API方式調(diào)用Kafka各種協(xié)議的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解
這篇文章主要介紹了基于Jenkins搭建.NET Core持續(xù)集成環(huán)境過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08