UML
類(lèi)圖介紹
一、
UML
簡(jiǎn)介
UML
(
Unified Modeling Language
)即統(tǒng)一建模語(yǔ)言,是
OMG
(
Object Management Group
)發(fā)表的圖標(biāo)式軟件設(shè)計(jì)語(yǔ)言。
UML
的功能:
可視化:使用圖表的形式來(lái)表現(xiàn)業(yè)務(wù)關(guān)系或者物理關(guān)系,可以促進(jìn)對(duì)問(wèn)題的理解和解決。
說(shuō)明:
UML
提供了一種通用的、精通的、沒(méi)有歧義的通信機(jī)制進(jìn)行。
建造:
UML
通過(guò)自己的語(yǔ)法規(guī)則使得可以通過(guò)使用建模工具軟件將設(shè)計(jì)模式映射到一種語(yǔ)言上。
建文檔:使用
UML
進(jìn)行設(shè)計(jì)可以同時(shí)產(chǎn)生系統(tǒng)設(shè)計(jì)文檔。
UML
包括:
??????
??????
用例圖(
Use case diagrams
)
??????
??????
類(lèi)圖(
Class diagrams
)
??????
??????
序列圖(
Sequence diagrams
)
??????
??????
合作圖(
Collaboration diagrams
)
??????
??????
狀態(tài)圖(
Statechart diagrams
)
??????
??????
活動(dòng)圖(
Activity diagrams
)
??????
??????
構(gòu)件圖(
Component diagrams
)
??????
??????
部署圖(
Deployment diagrams
)
(藍(lán)色為較重要并且常用的圖)
類(lèi)圖是最常用的
UML
圖,顯示出類(lèi)、接口以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系;它用于描述系統(tǒng)的結(jié)構(gòu)化設(shè)計(jì)。
類(lèi)圖最基本的元素是類(lèi)或者接口。
?
二、類(lèi)圖
?
1.
類(lèi)(
Class
)
一般包含
3
個(gè)組成部分。第一個(gè)是類(lèi)名;第二個(gè)是屬性(
attributes
);第三個(gè)是該類(lèi)提供的方法(
類(lèi)的性質(zhì)可以放在第四部分;如果類(lèi)中含有內(nèi)部類(lèi),則會(huì)出現(xiàn)第五個(gè)組成部分)。類(lèi)名部分是不能省略的,其他組成部分可以省略。
類(lèi)名書(shū)寫(xiě)規(guī)范:正體字說(shuō)明類(lèi)是可被實(shí)例化的,斜體字說(shuō)明類(lèi)為抽象類(lèi)。
屬性和方法書(shū)寫(xiě)規(guī)范:修飾符
[
描述信息
]
屬性、方法名稱(chēng)
[
參數(shù)
] [
:返回類(lèi)型
|
類(lèi)型
]
屬性和方法之前可附加的可見(jiàn)性修飾符:
加號(hào)(
+
)表示
public
;減號(hào)(
-
)表示
private
;
#
號(hào)表示
protected
;省略這些修飾符表示具有
package
(包)級(jí)別的可見(jiàn)性。
如果屬性或方法具有下劃線,則說(shuō)明它是靜態(tài)的。
??????
描述信息使用
<<
開(kāi)頭和使用
>>
結(jié)尾。
??????
類(lèi)的性質(zhì)是由一個(gè)屬性、一個(gè)賦值方法和一個(gè)取值方法組成。書(shū)寫(xiě)方式和方法類(lèi)似。
例
1
:
??????
public class TaxCalculator
{???
????? private long? taxRate ;
????? private int? 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
)
包是一種常規(guī)用途的組合機(jī)制。
UML
中的一個(gè)包直接對(duì)應(yīng)于
Java
中的一個(gè)包。在
Java
中,一個(gè)包可能含有其他包、類(lèi)或者同時(shí)含有這兩者。進(jìn)行建模時(shí),通常使用邏輯性的包,用于對(duì)模型進(jìn)行組織;使用物理性的包,用于轉(zhuǎn)換成系統(tǒng)中的
Java
包。每個(gè)包的名稱(chēng)對(duì)這個(gè)包進(jìn)行了惟一性的標(biāo)識(shí)。
例:
?
?
3.
接口(
Interface
)
接口是一系列操作的集合,它指定了一個(gè)類(lèi)所提供的服務(wù)。它直接對(duì)應(yīng)于
Java
中的一個(gè)接口類(lèi)型。接口的表示有大概兩種方式。具體畫(huà)法見(jiàn)下例:
例:
public interface TaxCalculator
{
????? public long countTax();
????? public int getSalary();
????? public void setSalary(int salary);
}
畫(huà)法一:
????? 畫(huà)法二:
畫(huà)法二
:
????? 畫(huà)法二:
?????
Interface
TaxCalculator
|
+countTax():long
+getSalary():int
+setSalary()
|
?
?
4.
關(guān)系
常見(jiàn)的關(guān)系有:一般化關(guān)系、實(shí)現(xiàn)關(guān)系、聚合關(guān)系、合成關(guān)系和依賴(lài)關(guān)系。請(qǐng)注意不同關(guān)系在圖中連線表示的不同。
?????
4.1
一般化關(guān)系(
Generalization
)
在有的書(shū)籍和資料中也叫做“泛化關(guān)系”。
?????
一般化關(guān)系表示類(lèi)與類(lèi)、接口與接口之間的繼承關(guān)系。關(guān)系中的箭頭由子類(lèi)指向父類(lèi)。在
Java
中,用
extends
關(guān)鍵字來(lái)直接表示這種關(guān)系。
?????
例:
public abstract class Employee{
}
public class Programmer extends Employee{
}
?
?
?
?
4.2
實(shí)現(xiàn)(
Realization
)
實(shí)例關(guān)系指定兩個(gè)實(shí)體之間的一個(gè)合同。換言之,一個(gè)實(shí)體定義一個(gè)合同,而另一個(gè)實(shí)體保證履行該合同。關(guān)系中的箭頭由實(shí)現(xiàn)接口的類(lèi)指向被實(shí)現(xiàn)的接口。在
Java
中,實(shí)現(xiàn)關(guān)系可直接用
implements
關(guān)鍵字來(lái)表示。
例:
public interface CollegePerson{
}
public class Professor implements CollegePerson{
}
表示方法一:(在
Rose2003
下實(shí)現(xiàn)如下,連接線沒(méi)有箭頭,因?yàn)榉较蝻@而易見(jiàn))
表示方法二:
表示方法二:
?
?
4.3
關(guān)聯(lián)(
Association
)
表示類(lèi)與類(lèi)之間的連接。它使一個(gè)類(lèi)的可見(jiàn)屬性和方法被另一個(gè)類(lèi)使用。關(guān)聯(lián)可以是雙向或者單向的。雙向的關(guān)聯(lián)箭頭是可選的,單向的箭頭指向遍歷或者查詢(xún)的方向。在
Java
中,關(guān)聯(lián)使用實(shí)例變量來(lái)實(shí)現(xiàn)。在關(guān)聯(lián)關(guān)系中可以使用附加的基數(shù)來(lái)說(shuō)明類(lèi)之間對(duì)應(yīng)的個(gè)數(shù)。
?
基數(shù)
|
含義
|
0..1
|
零個(gè)或者一個(gè)實(shí)例
|
0..*
或者
*
|
沒(méi)有限制,任意
|
1
|
有且只能一個(gè)實(shí)例
|
1..*
|
至少有一個(gè)實(shí)例
|
常見(jiàn)的基數(shù)
?
例:以權(quán)限中的用戶(hù)組、用戶(hù)角色為例,一個(gè)用戶(hù)角色可以屬于一個(gè)或者多個(gè)用戶(hù)組,一個(gè)用戶(hù)組則可以包含多個(gè)用戶(hù)角色。如果用戶(hù)組采用下面的方法來(lái)獲得用戶(hù)角色的權(quán)限
…
????? public class UserGroup{
private UserRole uRole ;
?????
????? ......
}
public class UserRole{
}
則表現(xiàn)在圖中為:(注意箭頭的畫(huà)法)
注意:一個(gè)關(guān)聯(lián)關(guān)系往往是聚合關(guān)系或者是合成關(guān)系。
注意:一個(gè)關(guān)聯(lián)關(guān)系往往是聚合關(guān)系或者是合成關(guān)系。
?
4.4
聚合(
Aggregation
)
聚合是關(guān)聯(lián)的一種形式,代表兩個(gè)類(lèi)之間的整體
/
局部關(guān)系。聚合暗示著整體在概念上處于比局部更高的一個(gè)級(jí)別,而關(guān)聯(lián)暗示兩個(gè)類(lèi)在概念上位于相同的級(jí)別。在
Java
中,聚合也是使用實(shí)例變量來(lái)實(shí)現(xiàn)的。
關(guān)聯(lián)和聚合的區(qū)別純粹是概念上的,在
Java
語(yǔ)法上分辨不出來(lái)的。聚合還暗示著實(shí)例圖中不存在回路。換言之,只能是一種單向關(guān)系。
例:汽車(chē)與輪胎的關(guān)系可以很好的說(shuō)問(wèn)題。
public class Car{
????? private Tyres tyres;
}
public class Tyres{
}
?
?
4.5
合成(
Composition
):[可以認(rèn)為關(guān)系更強(qiáng)烈]
合成是聚合的一種特殊形式,暗示
“
局部
”
在
“
整體
”
內(nèi)部的生存期職責(zé)。合成關(guān)系是不能共享的。所以,雖然局部不一定要隨整體的銷(xiāo)毀而被銷(xiāo)毀,但整體要么負(fù)責(zé)保持局部的存活狀態(tài),要么負(fù)責(zé)將其銷(xiāo)毀。局部不可與其他整體共享。但是,整體可將所有權(quán)轉(zhuǎn)交給另一個(gè)對(duì)象,后者隨即將承擔(dān)生存期職責(zé)。
?????
例:人和他的腿就是一個(gè)好的例子。
public class Man{
????? private Legs legs;
}
public class Legs{
}
?
?
?
4.6
依賴(lài)(
Dependency
)
依賴(lài)也是類(lèi)與類(lèi)之間的連接,并且依賴(lài)總是單向的。實(shí)體之間一個(gè)
“
使用
”
關(guān)
系暗示一個(gè)實(shí)體的規(guī)范發(fā)生變化后,可能影響依賴(lài)于它的其他實(shí)例。更具體地說(shuō),它可轉(zhuǎn)換為對(duì)不在實(shí)例作用域內(nèi)的一個(gè)類(lèi)或?qū)ο蟮娜魏晤?lèi)型的引用。其中包括一個(gè)
局部變量,對(duì)通過(guò)方法調(diào)用而獲得的一個(gè)對(duì)象的引用(如下例所示),或者對(duì)一個(gè)類(lèi)的靜態(tài)方法的引用(同時(shí)不存在那個(gè)類(lèi)的一個(gè)實(shí)例)。也可利用
“
依賴(lài)
”
來(lái)表示包和包之間的關(guān)系。由于包中含有類(lèi),所以你可根據(jù)那些包中的各個(gè)類(lèi)之間的關(guān)系,表示出包和包的關(guān)系。
例:給一個(gè)雇員計(jì)算薪水的時(shí)候
,
要使用計(jì)算器的例子
public class Employee{
????? public void calcSalary(Calculator cSalary)
????? {
????? }
}
?
?
?
三、小結(jié)
?????
在這里主要介紹了在閱讀、設(shè)計(jì)類(lèi)圖中可能遇到的細(xì)節(jié)。希望能對(duì)大家有所幫助。由于個(gè)人水平有限,對(duì)
UML
認(rèn)識(shí)不深,所以在正文中可能存在一些問(wèn)題和不足,希望大家指正。