箭頭:
指向父類或接口。
指向依賴物。
指向子元素。
繼承、實現是三角型箭頭,其他都爲箭頭
組合、聚合都有一個菱形端,且都爲實線,其他都無菱形端
繼承是實線,實現是虛線
關聯是實線
依賴是虛線
一般化關係/泛化/繼承
實現
關聯
聚合
組合/合成
依賴
傳統應用程序設計中所說的依賴一般指“類之間的關係”,那先讓我們複習一下類之間的關係:
泛化:表示類與類之間的繼承關係、接口與接口之間的繼承關係;
實現:表示類對接口的實現;
依賴:當類與類之間有使用關係時就屬於依賴關係,不同於關聯關係,依賴不具有“擁有關係”,而是一種“相識關係”,只在某個特定地方(比如某個方法體內)纔有關係。
關聯:表示類與類或類與接口之間的依賴關係,表現爲“擁有關係”;具體到代碼可以用實例變量來表示;
聚合:屬於是關聯的特殊情況,體現部分-整體關係,是一種弱擁有關係;整體和部分可以有不一樣的生命週期;是一種弱關聯;
組合:屬於是關聯的特殊情況,也體現了體現部分-整體關係,是一種強“擁有關係”;整體與部分有相同的生命週期,是一種強關聯;
1. 類(Class)
一般包含3個組成部分。第一個是類名;第二個是屬性(attributes);第三個是該類提供的方法(類的性質可以放在第四部分;如果類中含有內部類,則會出現第五個組成部分)。類名部分是不能省略的,其他組成部分可以省略。
類名書寫規範:正體字說明類是可被實例化的,斜體字說明類爲抽象類。
屬性和方法書寫規範:修飾符 [描述信息] 屬性、方法名稱 [參數] [:返回類型|類型]
屬性和方法之前可附加的可見性修飾符:
加號(+)表示public;減號(-)表示private;#號表示protected;省略這些修飾符表示具有package(包)級別的可見性。
如果屬性或方法具有下劃線,則說明它是靜態的。
描述信息使用 << 開頭和使用 >> 結尾。
類的性質是由一個屬性、一個賦值方法和一個取值方法組成。書寫方式和方法類似。
例1:
- public class TaxCalculator
- {
- private longtaxRate ;
- private intsalary;
- public TaxCalculator(long taxRate)
- {
- this.taxRate = taxRate ;
- }
- public long countTax()
- {
- return taxRate*salary;
- }
- public int getSalary()
- {
- return salary;
- }
- public void setSalary(int salary)
- {
- this.salary = salary;
- }
- }
TaxCalculator |
-taxRate:long |
+TaxCalculator(a:long) +countTax():long |
salary:long |
2. 包(Package)
包是一種常規用途的組合機制。UML中的一個包直接對應於Java中的一個包。在Java中,一個包可能含有其他包、類或者同時含有這兩者。進行建模時,通常使用邏輯性的包,用於對模型進行組織;使用物理性的包,用於轉換成系統中的Java包。每個包的名稱對這個包進行了惟一性的標識。例:
3. 接口(Interface)
接口是一系列操作的集合,它指定了一個類所提供的服務。它直接對應於Java中的一個接口類型。接口的表示有大概兩種方式。具體畫法見下例:
例:
- public interface TaxCalculator
- {
- public long countTax();
- public int getSalary();
- public void setSalary(int salary);
- }
畫法一:
畫法二 :
Interface TaxCalculator |
+countTax():long +getSalary():int +setSalary() |
4. 關係
常見的關係有:
一般化關係(繼承)、
實現關係(接口實現)、
聚合關係、
合成關係、
依賴關係。
請注意不同關係在圖中連線表示的不同。
4.1一般化關係(Generalization)
在有的書籍和資料中也叫做“泛化關係”。
一般化關係表示類與類、接口與接口之間的繼承關係。關係中的箭頭由子類指向父類。在Java中,用extends關鍵字來直接表示這種關係。
- public abstract class Employee{
- }
- public class Programmer extends Employee{
- }
4.2實現(Realization)
實例關係指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。關係中的箭頭由實現接口的類指向被實現的接口。在Java中,實現關係可直接用implements關鍵字來表示。
- public interface CollegePerson{
- }
- public class Professor implements CollegePerson{
- }
表示方法一:(在Rose2003 下實現如下,連接線沒有箭頭,因爲方向顯而易見)
表示方法二:
4.3關聯(Association)
表示類與類之間的連接。它使一個類的可見屬性和方法被另一個類使用。關聯可以是雙向或者單向的。雙向的關聯箭頭是可選的,單向的箭頭指向遍歷或者查詢的方向。在Java中,關聯使用實例變量來實現。在關聯關係中可以使用附加的基數來說明類之間對應的個數。
基數 |
含義 |
0..1 |
零個或者一個實例 |
0..*或者* |
沒有限制,任意 |
1 |
有且只能一個實例 |
1..* |
至少有一個實例 |
常見的基數
例:以權限中的用戶組、用戶角色爲例,一個用戶角色可以屬於一個或者多個用戶組,一個用戶組則可以包含多個用戶角色。如果用戶組採用下面的方法來獲得用戶角色的權限…
- public class UserGroup{
- private UserRole uRole ;
- ......
- }
- public class UserRole{
- }
則表現在圖中爲:(注意箭頭的畫法)
注意:一個關聯關係往往是聚合關係或者是合成關係。
4.4聚合(Aggregation)
聚合是關聯的一種形式,代表兩個類之間的整體/局部關係。聚合暗示着整體在概念上處於比局部更高的一個級別,而關聯暗示兩個類在概念上位於相同的級別。在Java中,聚合也是使用實例變量來實現的。
關聯和聚合的區別純粹是概念上的,在Java語法上分辨不出來的。聚合還暗示着實例圖中不存在迴路。換言之,只能是一種單向關係。
例:汽車與輪胎的關係可以很好的說問題。
- public class Car{
- private Tyres tyres;
- }
- public class Tyres{
- }
4.5合成、組合(Composition)
合成是聚合的一種特殊形式,暗示“局部”在“整體”內部的生存期職責。合成關係是不能共享的。所以,雖然局部不一定要隨整體的銷燬而被銷燬,但整體要麼負責保持局部的存活狀態,要麼負責將其銷燬。局部不可與其他整體共享。但是,整體可將所有權轉交給另一個對象,後者隨即將承擔生存期職責。
例:人和他的腿就是一個好的例子。
- public class Man{
- private Legs legs;
- }
- public class Legs{
- }
4.6依賴(Dependency)
依賴也是類與類之間的連接,並且依賴總是單向的。實體之間一個“使用”關 系暗示一個實體的規範發生變化後,可能影響依賴於它的其他實例。更具體地說,它可轉換爲對不在實例作用域內的一個類或對象的任何類型的引用。其中包括一個 局部變量,對通過方法調用而獲得的一個對象的引用(如下例所示),或者對一個類的靜態方法的引用(同時不存在那個類的一個實例)。也可利用“依賴”來表示包和包之間的關係。由於包中含有類,所以你可根據那些包中的各個類之間的關係,表示出包和包的關係。
例:給一個僱員計算薪水的時候,要使用計算器的例子
- public class Employee{
- public void calcSalary(Calculator cSalary)
- {
- }
- }