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

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

實現(Realization)
實現和我們java中的實現是一個意思,是一種類與接口的關系, 表示類是接口所有特征和行為的實現
箭頭指向:帶三角箭頭的虛線,箭頭指向接口
類圖如下:
關聯(Association)
是一種擁有的關系, 它使一個類知道另一個類的屬性和方法,這個概念聽起來感覺有點蒙,其實吧,就是一個對象A中持有對象B的引用,這樣對象B中的屬性和方法是不是A也知道了,就是這個意思,在實際的代碼中體現在一個類上聲明一個成員變量,類似這個
箭頭及指向:帶普通箭頭的實心線,指向被擁有者
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中聲明了一個Person類型的成員變量,這就是關聯,其實也是一種依賴,類圖如下:
它也可以自關聯,比如在android中我們也經常寫這種代碼:
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; }}它就是一種自關聯的關系
聚合(Aggregation)
是整體與部分的關系, 且部分可以離開整體而單獨存在,如車和輪胎是整體和部分的關系,輪胎離開車仍然可以存在
聚合關系是關聯關系的一種,是強的關聯關系;關聯和聚合在語法上無法區分,必須考察具體的邏輯關系
比如一個學校有高中部和初中部,這些學生加起來都是屬于這個學校的,那么從聚合的概念上講整體就是這個學校,部分就是學生了,且部分可以離開整體而單獨存在,這意思是說學生可以轉校去別的學校,但是這個學校還是存在的,不會因為一個學生轉校了找個學校就沒了,
箭頭指向:帶空心菱形的實心線,菱形指向整體
代碼體現:
package com.power;import java.util.List;/** * Created by admin on 2017/2/6. */public class School { private List<Student> students;}學生:package com.power;/** * Created by admin on 2017/2/6. */public class Student { public int age; public String name; public void listener(){ }}類圖如下:
組合(Composition)
是整體與部分的關系, 但部分不能離開整體而單獨存在. 如公司和部門是整體和部分的關系, 沒有公司就不存在部門組合關系是關聯關系的一種,是比聚合關系還要強的關系,它要求普通的聚合關系中代表整體的對象負責代表部分的對象的生命周期
代碼體現:成員變量
箭頭指向:帶實心菱形的實線,菱形指向整體
比如一個大廈肯定是由很多種材料構成的,如果沒有這些材料,這大廈就不存在了,意思是這個大廈生命周期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)
是一種使用的關系, 即一個類的實現需要另一個類的協助,所以要盡量不使用雙向的互相依賴
代碼表現:局部變量、方法的參數或者對靜態方法的調用
箭頭指向:帶箭頭的虛線,指向被使用者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("高三學生初八開始上課"); }}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();//學校通知所有學生去上課 } } }}這個School類中的notity()方法功能就是通知所有高三的學生什么時候開始上課,我們看到notiy()方法中的形參是一個集合,這種就是依賴關系,即一個類的實現需要另一個類的協助,也就是說School這個類要實現notiy()方法必須得依賴Student這個類,不然沒辦法實現!類圖:

各種關系的強弱順序:
泛化 >實現>組合>聚合> 關聯> 依賴
最后把這些關系在java代碼中的體現總結下:1) 依賴關系:關系對象出現在局部變量或者方法的參數里,或者關系類的靜態方法被調用 (2) 關聯關系:關系對象出現在實例變量中 (3) 聚合關系:關系對象出現在實例變量中 (4) 組合關系:關系對象出現在實例變量中 (5) 泛化關系: extends (6) 實現: implements
新聞熱點
疑難解答