設(shè)計(jì)模式之UML類圖
設(shè)計(jì)模式之UML類圖
學(xué)習(xí)設(shè)計(jì)模式,UML類圖是基礎(chǔ),通過UML類圖,能更好地和大家交流,也能很容易就表達(dá)出自己的設(shè)計(jì)想法,它就好比普通話,是一種標(biāo)準(zhǔn)語言。
現(xiàn)在流行的主要工具有兩種:RationalRose和MicrosoftVisio,這兩種工具都比較易用,選擇哪種工具就看個(gè)人的喜好了。本人對Microsoft的軟件比較有好感,所以自然MicrosoftVisio2003是我的首選。
類:
矩形框代表一個(gè)類(如圖-1),類圖分為三層,第一層為類的名稱,如果是抽象類類名用斜體字表示,如圖中動(dòng)物類所示。第二層是類的特性(通常就是類的字段和屬性)。第三層為類的操作(通常就是方法或行為)。注意前面的符號,“+”表示public,“-”表示private,“#”表示protected.
圖一
動(dòng)物類是一抽象類,它是不能被實(shí)例化的,而豬類可以被實(shí)例化。
接口:
UML類圖中接口有兩種表示方法:矩形表示法(如圖-2中的飛翔的接口)和棒棒糖表示法(如圖-2中唐老鴨類中實(shí)現(xiàn)講人話的接口)。矩形表示法,頂端有<<接口>>或者<<interface>>,第一行:接口名稱,第二行:接口方法。棒棒糖表示法,圓圈旁為接口名稱,接口方法在實(shí)現(xiàn)類中出現(xiàn),如唐老鴨類中的講話。
(圖-2)
泛化(Generalization)
UML類圖中泛化關(guān)系表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。具體表現(xiàn):父類父類實(shí)例=new子類();
(圖-3)
(圖-4)
用空心三角形+實(shí)線來表示繼承(如圖-3)。在靜態(tài)結(jié)構(gòu)圖中,在父類和子類間拖放歸納連接,箭頭指向父類,另一段指向子類。關(guān)聯(lián)關(guān)系是使用實(shí)例變量來實(shí)現(xiàn)。
用空心三角形+虛線來表示實(shí)現(xiàn)接口(如圖-4)。在靜態(tài)結(jié)構(gòu)圖中,右擊任意類形狀(“類”、“參數(shù)化的類”、“實(shí)用程序”或“元類”),單擊“形狀顯示選項(xiàng)”,然后在“常規(guī)選項(xiàng)”下選擇“實(shí)現(xiàn)鏈接”。將類形狀上的實(shí)現(xiàn)鏈接的控制手柄(黃色小菱形)粘附到接口、類或其他元素的連接點(diǎn)上。
關(guān)聯(lián)(Association)
UML類圖中對于兩個(gè)相對獨(dú)立的對象,當(dāng)一個(gè)對象的實(shí)例與另一個(gè)對象的一些特定實(shí)例存在固定的對應(yīng)關(guān)系時(shí),這兩個(gè)對象之間為關(guān)聯(lián)關(guān)系。關(guān)聯(lián)又分為雙向關(guān)聯(lián)、單向關(guān)聯(lián)、自身關(guān)聯(lián)。
雙向關(guān)聯(lián):雙向關(guān)聯(lián)是兩個(gè)類之間的聯(lián)接。關(guān)聯(lián)總是被假定是雙向的;這意味著,兩個(gè)類彼此知道它們間的聯(lián)系,除非你限定一些其它類型的關(guān)聯(lián)。如(圖-5)Flight的例子,顯示了在Flight類和Plane類之間的一個(gè)標(biāo)準(zhǔn)類型的關(guān)聯(lián)。
(圖-5)
一個(gè)雙向關(guān)聯(lián)用兩個(gè)類間的實(shí)線表示。在線的任一端,你放置一個(gè)角色名和多重值。圖-5顯示Flight與一個(gè)特定的Plane相關(guān)聯(lián),而且Flight類知道這個(gè)關(guān)聯(lián)。因?yàn)榻巧訮lane類表示,所以Plane承擔(dān)關(guān)聯(lián)中的“assignedPlane”角色。緊接于Plane類后面的多重值描述0...1表示,當(dāng)一個(gè)Flight實(shí)體存在時(shí),可以有一個(gè)或沒有Plane與之關(guān)聯(lián)(也就是,Plane可能還沒有被分配)。圖-5也顯示Plane知道它與Flight類的關(guān)聯(lián)。在這個(gè)關(guān)聯(lián)中,F(xiàn)light承擔(dān)“assignedFlights”角色;圖-5的圖告訴我們,Plane實(shí)體可以不與flight關(guān)聯(lián)(例如,它是一架全新的飛機(jī))或與沒有上限的flight(例如,一架已經(jīng)服役5年的飛機(jī))關(guān)聯(lián)。
由于對那些在關(guān)聯(lián)尾部可能出現(xiàn)的多重值描述感到疑惑,下面列出了一些多重值及它們含義的例子(0..1:0個(gè)或1個(gè);1:只能1個(gè);0..*:0個(gè)或多個(gè);*:0個(gè)或多個(gè);1..*:一個(gè)或多個(gè);等等。)
UML類圖單項(xiàng)關(guān)聯(lián):在一個(gè)單向關(guān)聯(lián)中,兩個(gè)類是相關(guān)的,但是只有一個(gè)類知道這種聯(lián)系的存在。(圖-6)顯示單向關(guān)聯(lián)的透支財(cái)務(wù)報(bào)告的一個(gè)實(shí)例。
(圖-6)
一個(gè)單向的關(guān)聯(lián),表示為一條帶有指向已知類的開放箭頭(不關(guān)閉的箭頭或三角形,用于標(biāo)志繼承)的實(shí)線。如同標(biāo)準(zhǔn)關(guān)聯(lián),單向關(guān)聯(lián)包括一個(gè)角色名和一個(gè)多重值描述,但是與標(biāo)準(zhǔn)的雙向關(guān)聯(lián)不同的時(shí),單向關(guān)聯(lián)只包含已知類的角色名和多重值描述。在(圖-6)中的例子中,OverdrawnAccountsReport知道BankAccount類,而且知道BankAccount類扮演“overdrawnAccounts”的角色。然而,和標(biāo)準(zhǔn)關(guān)聯(lián)不同,BankAccount類并不知道它與OverdrawnAccountsReport相關(guān)聯(lián)。
【編輯推薦】