今天玩下PowerDesigner工具玩下怎么畫(huà)類圖,在大型的項(xiàng)目中可能會(huì)有類圖,因?yàn)橛辛怂麄€(gè)項(xiàng)目的類結(jié)構(gòu)更加清晰,或者說(shuō)一個(gè)剛?cè)肼氝M(jìn)入你項(xiàng)目組的成員能更快的了解整個(gè)項(xiàng)目,畫(huà)類圖之前要明白類和類之間有幾種關(guān)系,如果這幾種關(guān)系都不知道,畫(huà)圖就是紙上談兵,常見(jiàn)的類和類之間的關(guān)系有如下幾種關(guān)系:
泛化(Generalization)
實(shí)現(xiàn)(Realization)
關(guān)聯(lián)(Association)
聚合(Aggregation)
組合(Composition)
依賴(Dependency)
現(xiàn)在一一講下上面幾種類之間關(guān)系的概念以及畫(huà)uml類圖結(jié)構(gòu):
泛化(Generalization)
是一種繼承關(guān)系, 表示一般與特殊的關(guān)系, 它指定了子類如何特化父類的所有非PRivate修飾的特征和行為,比如說(shuō)人有男人和女人,男人和女人即有共性的地方也有差異的地方
箭頭指向:帶三角箭頭的實(shí)線,箭頭指向父類

我們看到父類Person中有二個(gè)屬性age和name,還有三個(gè)三個(gè)方法eat(),sleep(),work()方法,二個(gè)子類Man和Woman都繼承了Person父類2個(gè)屬性age,name和二個(gè)方法eat(),sleep(),這些都是二個(gè)子類共有的屬性和父類,但是Man和Woman子類也有各自不同于父類的方法,在PowerDesigner中繼承的圖標(biāo)是這個(gè),如果不知道的話可以使用鼠標(biāo)放在每個(gè)圖標(biāo)上,如果上面有Generalization單詞就表示這是泛化關(guān)系。

實(shí)現(xiàn)(Realization)
實(shí)現(xiàn)和我們java中的實(shí)現(xiàn)是一個(gè)意思,是一種類與接口的關(guān)系, 表示類是接口所有特征和行為的實(shí)現(xiàn)
箭頭指向:帶三角箭頭的虛線,箭頭指向接口
類圖如下:
關(guān)聯(lián)(Association)
是一種擁有的關(guān)系, 它使一個(gè)類知道另一個(gè)類的屬性和方法,這個(gè)概念聽(tīng)起來(lái)感覺(jué)有點(diǎn)蒙,其實(shí)吧,就是一個(gè)對(duì)象A中持有對(duì)象B的引用,這樣對(duì)象B中的屬性和方法是不是A也知道了,就是這個(gè)意思,在實(shí)際的代碼中體現(xiàn)在一個(gè)類上聲明一個(gè)成員變量,類似這個(gè)
箭頭及指向:帶普通箭頭的實(shí)心線,指向被擁有者
package com.power;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { private Person person; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); person = new Man(); }}上面的activity中聲明了一個(gè)Person類型的成員變量,這就是關(guān)聯(lián),其實(shí)也是一種依賴,類圖如下:
它也可以自關(guān)聯(lián),比如在android中我們也經(jīng)常寫這種代碼:
package com.power;import android.app.application;/** * Created by admin on 2017/2/6. */public class MyApp extends Application { private static MyApp myApp; @Override public void onCreate() { super.onCreate(); myApp = this; }}它就是一種自關(guān)聯(lián)的關(guān)系
聚合(Aggregation)
是整體與部分的關(guān)系, 且部分可以離開(kāi)整體而單獨(dú)存在,如車和輪胎是整體和部分的關(guān)系,輪胎離開(kāi)車仍然可以存在
聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系;關(guān)聯(lián)和聚合在語(yǔ)法上無(wú)法區(qū)分,必須考察具體的邏輯關(guān)系
比如一個(gè)學(xué)校有高中部和初中部,這些學(xué)生加起來(lái)都是屬于這個(gè)學(xué)校的,那么從聚合的概念上講整體就是這個(gè)學(xué)校,部分就是學(xué)生了,且部分可以離開(kāi)整體而單獨(dú)存在,這意思是說(shuō)學(xué)生可以轉(zhuǎn)校去別的學(xué)校,但是這個(gè)學(xué)校還是存在的,不會(huì)因?yàn)橐粋€(gè)學(xué)生轉(zhuǎn)校了找個(gè)學(xué)校就沒(méi)了,
箭頭指向:帶空心菱形的實(shí)心線,菱形指向整體
代碼體現(xiàn):
package com.power;import java.util.List;/** * Created by admin on 2017/2/6. */public class School { private List<Student> students;}學(xué)生:package com.power;/** * Created by admin on 2017/2/6. */public class Student { public int age; public String name; public void listener(){ }}類圖如下:
組合(Composition)
是整體與部分的關(guān)系, 但部分不能離開(kāi)整體而單獨(dú)存在. 如公司和部門是整體和部分的關(guān)系, 沒(méi)有公司就不存在部門組合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系還要強(qiáng)的關(guān)系,它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分的對(duì)象的生命周期
代碼體現(xiàn):成員變量
箭頭指向:帶實(shí)心菱形的實(shí)線,菱形指向整體
比如一個(gè)大廈肯定是由很多種材料構(gòu)成的,如果沒(méi)有這些材料,這大廈就不存在了,意思是這個(gè)大廈生命周期over了,
package com.power;/** * Created by admin on 2017/2/6. * 材料 */public class Material { private int reinforced;//鋼筋 在這就用int類型表示了意思下}House.javapackage com.power;import java.util.ArrayList;import java.util.List;/** * Created by admin on 2017/2/6. * 大廈 */public class House { private List<Material> materials; public House(){ materials = new ArrayList<>(); }}類圖:
依賴(Dependency)
是一種使用的關(guān)系, 即一個(gè)類的實(shí)現(xiàn)需要另一個(gè)類的協(xié)助,所以要盡量不使用雙向的互相依賴
代碼表現(xiàn):局部變量、方法的參數(shù)或者對(duì)靜態(tài)方法的調(diào)用
箭頭指向:帶箭頭的虛線,指向被使用者package com.power;/** * Created by admin on 2017/2/6. */public class Student { public int age; public String name; public void listener(){ } public void notice(){ System.out.print("高三學(xué)生初八開(kāi)始上課"); }}package com.power;import java.util.List;/** * Created by admin on 2017/2/6. */public class School { public void notiy(List<Student> students){ if(students!=null&&!students.isEmpty()){ for(Student stu:students){ stu.notice();//學(xué)校通知所有學(xué)生去上課 } } }}這個(gè)School類中的notity()方法功能就是通知所有高三的學(xué)生什么時(shí)候開(kāi)始上課,我們看到notiy()方法中的形參是一個(gè)集合,這種就是依賴關(guān)系,即一個(gè)類的實(shí)現(xiàn)需要另一個(gè)類的協(xié)助,也就是說(shuō)School這個(gè)類要實(shí)現(xiàn)notiy()方法必須得依賴Student這個(gè)類,不然沒(méi)辦法實(shí)現(xiàn)!類圖:

各種關(guān)系的強(qiáng)弱順序:
泛化 >實(shí)現(xiàn)>組合>聚合> 關(guān)聯(lián)> 依賴
最后把這些關(guān)系在java代碼中的體現(xiàn)總結(jié)下:1) 依賴關(guān)系:關(guān)系對(duì)象出現(xiàn)在局部變量或者方法的參數(shù)里,或者關(guān)系類的靜態(tài)方法被調(diào)用 (2) 關(guān)聯(lián)關(guān)系:關(guān)系對(duì)象出現(xiàn)在實(shí)例變量中 (3) 聚合關(guān)系:關(guān)系對(duì)象出現(xiàn)在實(shí)例變量中 (4) 組合關(guān)系:關(guān)系對(duì)象出現(xiàn)在實(shí)例變量中 (5) 泛化關(guān)系: extends (6) 實(shí)現(xiàn): implements
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注