一、
UML
簡介
UML
(
Unified Modeling Language
)即統一建模語言,是
OMG
(
Object Management Group
)發表的圖標式軟件設計語言。
UML
的功能:
可視化、說明、建造、建文檔
UML
包括:
??????
??????
用例圖(
Use case diagrams
)
??????
??????
類圖(
Class diagrams
)
??????
??????
序列圖(
Sequence diagrams
)
??????
??????
合作圖(
Collaboration diagrams
)
??????
??????
狀態圖(
Statechart diagrams
)
??????
??????
活動圖(
Activity diagrams
)
??????
??????
構件圖(
Component diagrams
)
??????
??????
部署圖(
Deployment diagrams
)
(藍色為較重要并且常用的圖)
類圖是最常用的
UML
圖,顯示出類、接口以及它們之間的靜態結構和關系;它用于描述系統的結構化設計。
類圖最基本的元素是類或者接口。
二、類圖
1.
類(
Class
)
一般包含
3
個組成部分。第一個是類名;第二個是屬性(
attributes
);第三個是該類提供的方法(
類的性質可以放在第四部分;如果類中含有內部類,則會出現第五個組成部分)。類名部分是不能省略的,其他組成部分可以省略。
類名書寫規范:正體字說明類是可被實例化的,斜體字說明類為抽象類。
屬性和方法書寫規范:修飾符
[
描述信息
]
屬性、方法名稱
[
參數
] [
:返回類型
|
類型
]
屬性和方法之前可附加的可見性修飾符:
加號(
+
)表示
public
;減號(
-
)表示
private
;
#
號表示
protected
;省略這些修飾符表示具有
package
(包)級別的可見性。
如果屬性或方法具有下劃線,則說明它是靜態的。
??????
描述信息使用
<<
開頭和使用
>>
結尾。
??????
類的性質是由一個屬性、一個賦值方法和一個取值方法組成。書寫方式和方法類似。
例
1
:
??????
public class TaxCalculator
{???
????? private long? taxRate ;
????? private long? salary? ;
?????
????? 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
包。每個包的名稱對這個包進行了惟一性的標識。
例:
PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />/SPAN>
?
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{
}
則表現在圖中為:(注意箭頭的畫法)
?/SPAN>
注意:一個關聯關系往往是聚合關系或者是合成關系。
PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
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)
????? {
????? }
}