版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章包圖、組件圖和部署圖建模學(xué)習(xí)目標(biāo)
理解和掌握包圖、組件圖和部署圖的概念、作用和一般建模方法
理解和掌握包圖的概念、構(gòu)成元素、表示法、建模原則和建模方法
理解和掌握組件圖和部署圖的概念、構(gòu)成元素、表示法和建模方法
掌握狀態(tài)圖與活動(dòng)圖的建模方法第8章包圖、組件圖和部署圖建模大多數(shù)的軟件項(xiàng)目都需要都對(duì)系統(tǒng)的體系結(jié)構(gòu)進(jìn)行建模。分析階段建立的體系結(jié)構(gòu)模型往往僅是一個(gè)粗略的框架,而在系統(tǒng)設(shè)計(jì)階段要對(duì)這個(gè)粗略的體系結(jié)構(gòu)模型進(jìn)行進(jìn)一步的細(xì)化、補(bǔ)充和完善,以得到最終的系統(tǒng)軟、硬件系統(tǒng)體系結(jié)構(gòu)模型。面向?qū)ο蟮捏w系結(jié)構(gòu)模型主要使用構(gòu)件圖和部署圖來加以描述。本章將首先介紹用于描述模型結(jié)構(gòu)的包圖的建模方法,然后介紹構(gòu)件圖和部署圖的建模方法以及它們?cè)谙到y(tǒng)體系結(jié)構(gòu)建模中的應(yīng)用。8.1包圖一個(gè)完整的軟件模型通常是由多個(gè)部分組成,例如模型的視圖結(jié)構(gòu),為有效地組織一個(gè)模型的結(jié)構(gòu)。UML提供了包(Package)機(jī)制來定義和描述模型的結(jié)構(gòu)。包(Package)是一種基本的UML模型元素,也是一種用于存放或封裝模型元素的通用機(jī)制。包元素不僅可以用于組織模型元素,而且也可以用于定義或控制包中元素的可見性和訪問性。一個(gè)包可以擁有多個(gè)模型元素,但一個(gè)模型元素只能被一個(gè)包所擁有。如果從模型中刪除一個(gè)包,那么這個(gè)包所擁有的元素也都將被刪除。包中可以包含的元素的類型取決于包所在的位置(如所屬的視圖),這在不同的建模軟件中用不同的約定。8.1包圖UML把不屬于任何包的包稱為根包(rootpackage),根包的名稱通常就是模型的名字。任何一個(gè)模型中都有且僅有一個(gè)根寶。除了根包之外,模型中任何一個(gè)包都必須唯一地從屬于某一個(gè)包,稱后者為前者的父包,前者稱為后者的子包。另外,包是一種純概念元素,即它一般不會(huì)被映射成最終的目標(biāo)系統(tǒng)中的可運(yùn)行的實(shí)例。換句話說,包是一種不能被實(shí)例化到最終的目標(biāo)系統(tǒng)中去的概念性元素。包圖(PackageDiagram)是一種用于描述包和包之間關(guān)系的圖,包圖建模關(guān)注的重點(diǎn)在于模型元素的組織結(jié)構(gòu),同時(shí)也關(guān)注包之間的關(guān)系。8.1.1包圖的構(gòu)成元素包圖中的主要構(gòu)成元素就是包括包和包之間的關(guān)系,當(dāng)然也包括指向模型中任何一個(gè)圖的鏈接或引用,還包括注釋等公共元素。1.包包(Package)是包圖中最基本的模型元素。每個(gè)包都有其名字,在相同的上下文中,包應(yīng)具有唯一的包名字。包命名的主要問題就是避免命名沖突,命名時(shí)應(yīng)避免不同元素使用相同的名字。當(dāng)不同包中的兩個(gè)模型元素取相同的名字時(shí),可以使用路徑名來加以區(qū)別。包中元素也有可見性問題,包的可見性主要用于控制包中元素的可見性和訪問性。與類的可見性一樣,包中元素的可見性也被分為公共(public)、私有(private)和保護(hù)(protected)等三種情況。8.1.1包圖的構(gòu)成元素具體含義如下:(1)具有公共可見性的元素,對(duì)所有包都是可見的。(2)具有私有可見性的元素,僅對(duì)包含這些元素的包是可見的,對(duì)其余任何包都是不可見的。這意味著,私有元素只能被擁有該元素的包中元素使用和訪問。(3)具有保護(hù)可見性的元素,僅對(duì)包含這些元素的包及其子包(有泛化關(guān)系的子包)是可見的,而對(duì)于其余的包均是不可見的。8.1.1包圖的構(gòu)成元素如圖8-1給出了一個(gè)包圖的例子,圖中包含了一個(gè)名為Packge3的包元素,這個(gè)包中包含了A、B、C和D四個(gè)公共可見性的類。圖中還嵌入了一個(gè)描述了這些類之間關(guān)系的類圖。圖8-1包圖的例子8.1.1包圖的構(gòu)成元素具體含義如下:(1)具有公共可見性的元素,對(duì)所有包都是可見的。(2)具有私有可見性的元素,僅對(duì)包含這些元素的包是可見的,對(duì)其余任何包都是不可見的。這意味著,私有元素只能被擁有該元素的包中元素使用和訪問。(3)具有保護(hù)可見性的元素,僅對(duì)包含這些元素的包及其子包(有泛化關(guān)系的子包)是可見的,而對(duì)于其余的包均是不可見的。8.1.1包圖的構(gòu)成元素2.包之間的依賴包之間通常有依賴、精化和泛化等多種關(guān)系。除了結(jié)構(gòu)性的關(guān)系以外,包之間的關(guān)系主要取決于這兩個(gè)包中包含的元素之間的關(guān)系。(1)包之間的依賴關(guān)系在模型中使用包機(jī)制就不可避免地使模型的元素分布在多個(gè)不同的包里,同樣不可避免的另一個(gè)問題就是一個(gè)包的元素引用另外一個(gè)(或一些)包中的元素。也就是說,不同包中元素之間的關(guān)系導(dǎo)致了包之間的關(guān)系。8.1.1包圖的構(gòu)成元素如果一個(gè)包中的元素使用了另一個(gè)包中的元素,則稱這兩個(gè)包之間也存在著某種依賴關(guān)系。為了清楚地描述包之間的關(guān)系,UML還可以使用構(gòu)造型機(jī)制描述包之間的不同依賴關(guān)系。常見的構(gòu)造型有導(dǎo)入依賴(import)、訪問依賴(access)和合并依賴(merge)等。8.1.1包圖的構(gòu)成元素1)導(dǎo)入依賴導(dǎo)入?import?依賴表示一個(gè)包可以引用導(dǎo)入包中的可引用元素,可引用元素不僅包括導(dǎo)入包中的元素,也包括導(dǎo)入包從其他包中導(dǎo)入的可引用元素。并且導(dǎo)入包可以不使用完全路徑名稱就可以使用這些引入的元素。在包圖中,可以使用帶有構(gòu)造型?import?的依賴表示導(dǎo)入依賴。2)訪問依賴和導(dǎo)入依賴關(guān)系類似,訪問依賴關(guān)系主要用于指定包之間元素的訪問關(guān)系,其含義是導(dǎo)入包中的元素也可以訪問被導(dǎo)入包中的公共元素,但只能訪問被導(dǎo)入的包中的元素,并且不能省略元素名的路徑。在包圖中,使用帶有構(gòu)造型《access》的依賴表示導(dǎo)入依賴。8.1.1包圖的構(gòu)成元素3)合并依賴合并依賴是使用構(gòu)造型?merge?表示的依賴,其含義是將指定包中的元素合并到當(dāng)前包中,合并的元素還包括從其他包中合并到導(dǎo)入包中的元素。合并時(shí),如果當(dāng)前包中已經(jīng)包含了要合并的模型元素,那么這些合并過來的元素將被定義成原有元素的某種擴(kuò)展,并且所有合并導(dǎo)入新的元素都將被標(biāo)記為源包的泛化。在建模過程中,如果希望將一些包合并成一個(gè)包時(shí),就可以使用?merge?依賴來描述這樣的建模意圖。合并時(shí),必須要考慮解決元素的命名沖突問題,解決方法要視這些元素的具體情況而定。8.1.1包圖的構(gòu)成元素(2)包之間的泛化如果一個(gè)包中元素繼承了另一個(gè)包中某些公共或保護(hù)的元素時(shí),我們就稱兩個(gè)包之間具有泛化關(guān)系。包間的泛化的表示法與類的泛化的表示方法相同。圖8-2給出了一個(gè)描述了包間的泛化關(guān)系的實(shí)例。圖8-2給出了一個(gè)描述了包泛化的例子。圖中的Common、SqlClient和OleDb分別是.NET中的三個(gè)類包,這三個(gè)包中的類之間的泛化關(guān)系(如圖8-3所示)導(dǎo)致了這些包之間存在的泛化關(guān)系。需要時(shí),可以將這些關(guān)系繪制在包圖中。8.1.1包圖的構(gòu)成元素圖8-2包之間的泛化8.1.1包圖的構(gòu)成元素圖8-3包內(nèi)元素之間的泛化8.1.1包圖的構(gòu)成元素3.超鏈接包圖中常見的另一種元素是超鏈接,其含義是一種對(duì)模型中另一資源的引用形式,如模型中的某個(gè)UML圖等。建模時(shí),可以將模型中已經(jīng)存在一張圖拖放到當(dāng)前包圖中,再將其設(shè)置成超鏈接形式。超鏈接是包圖中包含的除了包和包關(guān)系之外最重要的模型元素,它起到了在模型中導(dǎo)航的重要作用。雙擊這一元素,可以直接導(dǎo)航到它所指向的軟件模型。如圖8-4中的包圖中就給出了一個(gè)指向某類圖(Associationbetweenreaderandbooks)的超鏈接。8.1.2包的設(shè)計(jì)原則在UML中,包的建模發(fā)揮了組織模型結(jié)構(gòu)的重要作用。模型中的任何一個(gè)包都是模型的特定組成部分,并且不同的包在模型中的地位和作用也不盡相同。另外,在包之間除了存在著結(jié)構(gòu)性的層次結(jié)構(gòu)關(guān)系之外,同時(shí)存在由包中存放的模型元素所帶來的如依賴、繼承等各種關(guān)系。因此,這些錯(cuò)綜復(fù)雜的關(guān)系也為包的設(shè)計(jì)帶來了模型結(jié)構(gòu)方面的復(fù)雜性。清晰的模型結(jié)構(gòu)顯然更有利于提高軟件建模工作的質(zhì)量和工作效率。設(shè)計(jì)包時(shí),最基本的設(shè)計(jì)原則就是要盡可能簡化包之間的關(guān)系,或者說要盡可能減少和弱化包之間的關(guān)系。設(shè)計(jì)時(shí),通常需要考慮如下一些設(shè)計(jì)原則。8.1.2包的設(shè)計(jì)原則1.共同閉包原則共同閉包原則指把需要同時(shí)改變(或有依賴關(guān)系)的模型元素放在同一個(gè)閉包中。閉包指包含模型元素的包或某個(gè)上層的包。需要同時(shí)改變的模型元素也就是指具有某種依賴關(guān)系的模型元素,這些關(guān)系包括泛化、組合、聚合、關(guān)聯(lián)、依賴和實(shí)現(xiàn)等關(guān)系。將有依賴關(guān)系的模型元素存放在同一個(gè)閉包中,可以有效地控制相關(guān)元素在模型中的分布范圍。當(dāng)修改了某個(gè)模型元素時(shí),不容易遺漏對(duì)相關(guān)模型元素的修改。反之,將需要在分別存放這些模型元素的包之間引入新的依賴關(guān)系。8.1.2包的設(shè)計(jì)原則2.共同重用原則共同重用原則要求不要把不相關(guān)的類放在同一個(gè)包中,這個(gè)原則的作用在于回避不存在的依賴關(guān)系。例如,當(dāng)包中的某個(gè)模型元素發(fā)生了某種改變,建模時(shí),我們就可能會(huì)檢查這個(gè)包中的所有元素,以便做出相應(yīng)的修改。違反了這個(gè)原則時(shí),會(huì)增加很多無謂的工作負(fù)擔(dān)。8.1.2包的設(shè)計(jì)原則3.可重用原則可重用原則是指設(shè)計(jì)包時(shí)應(yīng)充分考慮包的可重用性問題。當(dāng)你的設(shè)計(jì)中包含了具有可重用性考慮的需要時(shí),就可以考慮添加一個(gè)合適的包作為可重用包,并將模型中可重用的模型元素分門別類地組織在這樣的包中。并把可重用性作為包的特性明確地標(biāo)記清楚,例如標(biāo)記一個(gè)《reuse》構(gòu)造型等。同時(shí),還要避免將非重用的模型元素放在這樣的包中??芍赜玫哪P驮赝ǔJ悄切╊I(lǐng)域相關(guān)的或與具體業(yè)務(wù)邏輯無關(guān)或弱相關(guān)的模型元素,它們一般屬于某個(gè)特定的應(yīng)用領(lǐng)域,如可重用的類和構(gòu)件等。8.1.2包的設(shè)計(jì)原則4.非循環(huán)依賴原則非循環(huán)依賴原則是指不允許在包之間存在循環(huán)的依賴關(guān)系,循環(huán)依賴嚴(yán)重會(huì)增加模型結(jié)構(gòu)的復(fù)雜性和耦合度。如果循環(huán)依賴是由模型元素之間的依賴引起的,這樣的設(shè)計(jì)會(huì)嚴(yán)重影響設(shè)計(jì)質(zhì)量,甚至影響目標(biāo)系統(tǒng)的可重用性和可擴(kuò)展性等質(zhì)量指標(biāo)。消除循環(huán)依賴的最根本的方法是重構(gòu)你的設(shè)計(jì),消除模型元素之間存在的不合理的依賴,并消除包之間的循環(huán)依賴。8.1.2包的設(shè)計(jì)原則總之,上述原則僅是一些一般性的建模原則,最基本的建模原則要求建立的包結(jié)構(gòu)要有利于建立滿足高內(nèi)聚低耦合的軟件結(jié)構(gòu)。另外,包之間實(shí)際存在的依賴關(guān)系并不取決于包的結(jié)構(gòu)關(guān)系,而是取決于包中存放的模型元素。因此,包中元素的存放也必須要嚴(yán)格遵守包的可見性和可訪問性等規(guī)則。8.1.3
包圖的建模方法軟件模型中,包圖的主要作用。1定義或描述軟件模型的結(jié)構(gòu),以圖形的方式描述模型的包和包之間關(guān)系;2在軟件模型中添加必要的導(dǎo)航。目前的建模軟件均支持包圖的導(dǎo)航功能,借助這個(gè)功能,建模人員可以更高效地查找或?yàn)g覽軟件模型的內(nèi)容,從而提高建模的工作效率。8.1.3
包圖的建模方法1.定義模型的基本結(jié)構(gòu)目前的UML建模工具通常會(huì)給出一系列預(yù)定義的模型模板,建模人員可以根據(jù)要完成的工作性質(zhì)和內(nèi)容選擇滿足其需求的模板,并定制其模板的主要內(nèi)容。例如,建模人員要完成的是一個(gè)完整的軟件項(xiàng)目時(shí),就可能會(huì)選擇標(biāo)準(zhǔn)的軟件模型模板,并為模型選擇合適的子模型,如用例視圖、邏輯模型視圖、構(gòu)件視圖、動(dòng)態(tài)視圖和部署視圖等標(biāo)準(zhǔn)的視圖。這時(shí),就創(chuàng)建了一個(gè)基本的軟件模型了。此時(shí)可以為模型的根包添加一個(gè)包圖,也可以將根包中的每個(gè)子包元素添加到這張包圖中,以展現(xiàn)當(dāng)前包的結(jié)構(gòu),還可以為這些包元素添加必要的關(guān)系。當(dāng)然,也可以為每個(gè)子包添加一張包圖。此時(shí),系統(tǒng)將自動(dòng)建立從根包的包圖到子包的包圖之間的鏈接。即從根包導(dǎo)航到子包中的包圖。8.1.3
包圖的建模方法2.定義各子包的模型元素和包圖當(dāng)子包是模型的某個(gè)視圖時(shí),包內(nèi)元素代表的就是軟件建模的某個(gè)階段需要的模型元素了。例如,用例視圖(包)需要的主要元素通常就是參與者、用例和軟件概念模型等需求建模階段需要的內(nèi)容;邏輯視圖需要的模型元素則是描述軟件結(jié)構(gòu)所需要的類和描述類之間關(guān)系所需要的類圖等。UML規(guī)定任何包均可以包含子包,因此建模人員可以根據(jù)實(shí)際情況定義需要的子包并規(guī)劃好子包之間的邏輯關(guān)系。為了描述和理解包之間的關(guān)系,有必要在這樣的包中添加包圖,以描述當(dāng)前包的結(jié)構(gòu)和建立包之間的導(dǎo)航,當(dāng)然也可以建立向包內(nèi)其他各圖或相關(guān)的各種圖的導(dǎo)航。8.1.3
包圖的建模方法最后要說明的是,除了結(jié)構(gòu)性的關(guān)系以外,包之間實(shí)際存在的各種依賴關(guān)系并不取決于包圖中的關(guān)系描述,而取決于包內(nèi)存放的元素之間實(shí)際存在的關(guān)系。因此,繪制在包圖中的包之間的依賴關(guān)系僅僅是建模人員的主觀設(shè)計(jì)或主觀描述,它們也可以看成是建模對(duì)模型元素存放的一種建模規(guī)劃或建模約束。8.2
構(gòu)件圖面向?qū)ο蠓椒ㄖ?,軟件體系結(jié)構(gòu)一般可以使用包圖的進(jìn)行建模。在UML中,描述軟件體系結(jié)構(gòu)的包又可以由若干個(gè)構(gòu)件組成。構(gòu)件圖通常被定義成若干個(gè)構(gòu)件及這些構(gòu)件之間的關(guān)系構(gòu)成的集合,構(gòu)件可以看成是系統(tǒng)邏輯結(jié)構(gòu)模型中定義的概念和功能(如類、對(duì)象及它們間的關(guān)系和協(xié)作)在物理體系結(jié)構(gòu)中的實(shí)現(xiàn),它通常是開發(fā)環(huán)境中的實(shí)現(xiàn)性文件。8.2.1構(gòu)件及其特點(diǎn)構(gòu)件是系統(tǒng)中遵從一組特定接口并提供實(shí)現(xiàn)的一個(gè)物理的、可部署和可替換的單元。構(gòu)件也具有封裝性,構(gòu)件一方面封裝了其內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),另一方面還清楚地展現(xiàn)其對(duì)外接口。構(gòu)件還具有可重用性,是軟件復(fù)用的基本物理實(shí)現(xiàn)單元,也是邏輯模型元素(如類、接口、協(xié)作等)的物理包。在UML中,一個(gè)對(duì)象庫、可執(zhí)行程序、組件(如COM+組件或企業(yè)級(jí)JavaBeans等)都可以描述成構(gòu)件。構(gòu)件的內(nèi)部元素所實(shí)現(xiàn)的服務(wù)則通過其對(duì)外提供的一組接口來加以描述。對(duì)于系統(tǒng)功能在物理結(jié)點(diǎn)上的配置則通常采用部署圖進(jìn)行描述。8.2.1構(gòu)件及其特點(diǎn)1.構(gòu)件的主要特征構(gòu)件可能會(huì)根據(jù)其表示內(nèi)容的不同而呈現(xiàn)出不同的表示形式。但大多數(shù)情況下的構(gòu)件一般都具有如下一些特征(1)可重用性軟件項(xiàng)目中,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)組件的目的不僅僅是為了完成當(dāng)前的項(xiàng)目,而且還考慮組建在將來其他項(xiàng)目中的重用。構(gòu)件最重要的特征就是它的可重用性,可重用性要求構(gòu)件僅包含那些抽象的(或業(yè)務(wù)無關(guān)的)功能,其抽象程度越高則其可復(fù)用的程度就越強(qiáng)。8.2.1構(gòu)件及其特點(diǎn)(2)結(jié)構(gòu)性從結(jié)構(gòu)上看,構(gòu)件不外乎就是由一組類和接口構(gòu)成的集合。其中的各個(gè)類、接口之間的關(guān)系不外乎也就是泛化、關(guān)聯(lián)、聚合、組合、依賴和實(shí)現(xiàn)等關(guān)系。(3)封裝性構(gòu)件也同類一樣具有其特定的內(nèi)部狀態(tài)屬性和期望的外部行為。所以,構(gòu)件同樣應(yīng)具有封裝性的特征。另外,從可重用性的角度來看,構(gòu)件面臨的是不確定的應(yīng)用環(huán)境,因此構(gòu)件的封裝型定義應(yīng)充分地考慮到其功能擴(kuò)展、信息一致和信息安全等方面的要求。8.2.1構(gòu)件及其特點(diǎn)(4)語言無關(guān)性構(gòu)件通??赡苡脕韺?shí)現(xiàn)某個(gè)通用的功能或封裝了某個(gè)抽象的業(yè)務(wù)邏輯,這些通常與實(shí)現(xiàn)這些功能的語言是無關(guān)的。例如,某個(gè)封裝了POP3協(xié)議的電子郵件組件。雖然這些組件最終都要通過使用某種特定的程序設(shè)計(jì)語言加以實(shí)現(xiàn),但組件的功能與語言卻可以是無關(guān)的,并且實(shí)現(xiàn)組件使用的語言和重用組件的項(xiàng)目所用的語言也可以不盡相同,有時(shí)甚至可以完全不同。(5)可靠性構(gòu)件的開發(fā)一般都經(jīng)過了比較嚴(yán)格的測(cè)試,基本上不會(huì)含有錯(cuò)誤,出現(xiàn)錯(cuò)誤的概率大大降低。8.2.1構(gòu)件及其特點(diǎn)2.構(gòu)件與類之間的區(qū)別構(gòu)件和類之間有著極大的相似性,但它們之間也存在著一些很明顯的區(qū)別。其主要區(qū)別主要體現(xiàn)在抽象層次和表現(xiàn)形式兩個(gè)方面。(1)二者的抽象層次不同類是對(duì)系統(tǒng)描述的某些實(shí)體的一種邏輯抽象,這些實(shí)體通常僅承擔(dān)系統(tǒng)中某些比較小的粒度的職責(zé)。組件則是一種物理的抽象,通常用于表示系統(tǒng)中某個(gè)粒度較大或具有比較完整的功能的具體實(shí)現(xiàn)。8.2.1構(gòu)件及其特點(diǎn)(2)二者的表現(xiàn)形式不同類的表現(xiàn)形式主要包括類的定義、類的實(shí)現(xiàn),其內(nèi)容包括屬性和操作的描述,其內(nèi)容通常是靜態(tài)的,也是邏輯的。一般情況下,構(gòu)件的表示形式則通常僅是物理的,對(duì)應(yīng)用構(gòu)件的環(huán)境來說,構(gòu)件的內(nèi)部結(jié)構(gòu)是不可見的,可見的僅僅是操作或構(gòu)件所公開的外部接口。8.2.2構(gòu)件圖的主要元素構(gòu)件圖的最基本構(gòu)成元素主要包括構(gòu)件和構(gòu)件之間的鏈接兩大類元素。構(gòu)件圖中通??梢允褂脴?gòu)件(Component)、類(class)、接口(interface)、端口(port)、對(duì)象(Object)和工件(Artifact)等實(shí)體元素,以及關(guān)聯(lián)(Association)、泛化(Generalization)、代理(Delegate)、實(shí)現(xiàn)(realize)和聚合(Assembly)等連接元素,這些鏈接元素主要用于連接實(shí)體元素。8.2.2構(gòu)件圖的主要元素如圖8-5給出了構(gòu)件圖中的各種基本實(shí)體元素的UML符號(hào)表示。圖8-5構(gòu)件圖中基本實(shí)體元素的圖形符號(hào)表示8.2.2構(gòu)件圖的主要元素1.構(gòu)件(Component)構(gòu)件(Component)可以看成是系統(tǒng)中遵從一組接口并提供實(shí)現(xiàn)的一個(gè)物理的、可替換的單元,構(gòu)件的圖形符號(hào)表示可見圖8-5所示。目標(biāo)系統(tǒng)中的任何一組對(duì)象、一個(gè)可執(zhí)行程序、一個(gè)可重用的組件(如COM+組件等),甚至是一組源程序代碼都可以描述成構(gòu)件。構(gòu)件包(PackagingComponent)是一種用包的形式表示的構(gòu)件,用來描述包的構(gòu)成元素的層次結(jié)構(gòu)。8.2.2構(gòu)件圖的主要元素2.端口(port)端口(port)是一個(gè)類、子系統(tǒng)或構(gòu)件與其環(huán)境之間的交互,用于描述控制這個(gè)交互所需要的接口。任何一個(gè)指向一個(gè)端口的連接必須提供端口所需要的接口。建模時(shí),端口可放置在類或構(gòu)建的邊界上。與其他模型元素一樣,每個(gè)端口都需要有一個(gè)名字。8.2.2構(gòu)件圖的主要元素2.端口(port)圖8-6給出了構(gòu)件圖中端口的圖形符號(hào)表示,圖中構(gòu)件上的小圓角矩形就是一個(gè)端口,它直觀地描述了構(gòu)件對(duì)外提供的交互。圖8-6構(gòu)件圖中端口的圖形符號(hào)表示8.2.2構(gòu)件圖的主要元素3.工件(Artifact)工件(Artifact)的含義是人工制品,在構(gòu)件圖中,表示軟件開發(fā)過程中產(chǎn)生的中間或最終產(chǎn)品,包括文檔、模型和程序等。4.聚合(Assembly)聚合(Assembly)表示構(gòu)件圖中的實(shí)體元素(構(gòu)件或類)之間通過接口連接起來的連接關(guān)系。8.2.2構(gòu)件圖的主要元素圖8-7給出了兩個(gè)構(gòu)件之間的聚合關(guān)系,描述的是構(gòu)件PackagingComponent和構(gòu)件Component之間存在的某種聚集(接口依賴)關(guān)系。圖8-7構(gòu)件之間的聚合關(guān)系8.2.2構(gòu)件圖的主要元素除了聚集關(guān)系,構(gòu)件圖中還可以使用關(guān)聯(lián)、聚合、實(shí)現(xiàn)和代理等關(guān)系。這些關(guān)系的表示和含義與類圖中的這些關(guān)系是完全一樣的。8.2.2構(gòu)件圖的主要元素5.接口(Interface)構(gòu)件的接口分為供接口(ProviderInterface)和需接口(RequiredInterface)兩種。供接口(ProviderInterface)是由構(gòu)件定義并向外發(fā)布的接口,環(huán)境可以通過接口訪問構(gòu)件并獲得構(gòu)件提供的服務(wù)。需接口(RequiredInterface)也是由構(gòu)件定義并向外發(fā)布的接口,環(huán)境中實(shí)現(xiàn)了該接口的對(duì)象可以通過這個(gè)對(duì)象與構(gòu)件協(xié)作完成系統(tǒng)功能。圖8-7給出了構(gòu)件的供接口和需接口的圖形符號(hào)表示。8.2.2構(gòu)件圖的主要元素供接口和需接口之間是有細(xì)微的區(qū)別的,二者的主要區(qū)別在于:供接口代表了構(gòu)件為其客戶提供的服務(wù)。而需接口代表了構(gòu)件在為其客戶提供這些服務(wù)的過程中,反過來需要客戶提供的某些協(xié)作。供接口和需接口為構(gòu)件與其客戶之間的協(xié)作提供了一個(gè)完整的合作機(jī)制。這種協(xié)作的本質(zhì)特征是實(shí)現(xiàn)了客戶需要的某些功能。8.2.2構(gòu)件圖的主要元素圖8-8給出了構(gòu)件(Component)及其與環(huán)境之間的供接口和需接口。除了聚集關(guān)系,構(gòu)件圖中還可以使用關(guān)聯(lián)、聚合和實(shí)現(xiàn)等關(guān)系。這些關(guān)系的表示方法和含義與類圖中的這些關(guān)系是完全一樣的。圖8-8供接口和需接口的圖形符號(hào)表示8.2.3構(gòu)件圖的應(yīng)用舉例1.?dāng)?shù)據(jù)報(bào)表構(gòu)件在信息系統(tǒng)中,輸出數(shù)據(jù)報(bào)表是一種非常常用的功能,尤其是一個(gè)軟件需要輸出大量的,各種各樣的數(shù)據(jù)報(bào)表的情況。因此,從軟件中分離報(bào)表功能,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)獨(dú)立的,可重用的數(shù)據(jù)報(bào)表構(gòu)件將具有十分重要的現(xiàn)實(shí)意義。所謂的數(shù)據(jù)報(bào)表構(gòu)件可以看成是一個(gè)二進(jìn)制形式的可執(zhí)行的軟件構(gòu)件,其主要功能包括生成、顯示和打印一個(gè)由一系列數(shù)據(jù)對(duì)象組成的數(shù)據(jù)報(bào)表。為了支持重用,所生成的報(bào)表的結(jié)構(gòu)還應(yīng)該具有較強(qiáng)的通用性。8.2.3構(gòu)件圖的應(yīng)用舉例從功能上來看,構(gòu)件應(yīng)能夠根據(jù)輸出數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容和輸出上下文(窗口或打印機(jī))等信息生成數(shù)據(jù)報(bào)表,這即包括計(jì)算報(bào)表的總體格式,也包括報(bào)表中每個(gè)數(shù)據(jù)項(xiàng)的位置和格式等顯示和打印需要信息。還應(yīng)該負(fù)責(zé)顯示和打印生成的數(shù)據(jù)報(bào)表。整個(gè)構(gòu)件的創(chuàng)建、生成、顯示和打印控制等功能均由構(gòu)件負(fù)責(zé)完成。在輸出的數(shù)據(jù)報(bào)表中,輸出的每個(gè)數(shù)據(jù)項(xiàng)的內(nèi)容和格式則由用戶提供的數(shù)據(jù)對(duì)象提供。從結(jié)構(gòu)上看,構(gòu)件需要一個(gè)控制對(duì)象和一個(gè)數(shù)據(jù)對(duì)象構(gòu)成,控制對(duì)象負(fù)責(zé)完成與客戶程序以及用戶之間的交互,從而實(shí)現(xiàn)報(bào)表的生成、顯示和打印,數(shù)據(jù)對(duì)象用于存儲(chǔ)用戶輸入的報(bào)表數(shù)據(jù),還要緩存根據(jù)輸入數(shù)據(jù)生成的報(bào)表的內(nèi)部表示。8.2.3構(gòu)件圖的應(yīng)用舉例為了能夠在不同的軟件系統(tǒng)中使用這個(gè)構(gòu)件,構(gòu)件需要向客戶提供輸入數(shù)據(jù)的接口。為了實(shí)現(xiàn)與用戶的交互,構(gòu)件還定義了自己的圖形用戶界面,還要定義使用打印機(jī)控制的接口??梢詫?gòu)件中控制對(duì)象的方法定義成構(gòu)件的供接口,客戶可以通過這個(gè)接口與構(gòu)件交互。同時(shí),還需要為數(shù)據(jù)對(duì)象定義一個(gè)用于顯示或打印的接口,這就是所謂的構(gòu)件的一個(gè)需接口,加入到構(gòu)件中的每一個(gè)數(shù)據(jù)對(duì)象都需要實(shí)現(xiàn)這個(gè)接口。8.2.3構(gòu)件圖的應(yīng)用舉例圖8-9描述了這個(gè)構(gòu)件的供接口和需接口的定義,圖中包括了構(gòu)件的一個(gè)供接口和三個(gè)需接口。IDataReport是構(gòu)件的供接口,客戶程序使用構(gòu)件時(shí),需要實(shí)現(xiàn)這個(gè)結(jié)構(gòu),并使用這個(gè)實(shí)現(xiàn)構(gòu)造數(shù)據(jù)報(bào)表對(duì)象。其中的IDataItem、IUserInterface和IPrinterInterface是三個(gè)需接口,分別表示數(shù)據(jù)項(xiàng)、用戶界面和打印機(jī)控制接口等三個(gè)接口。使用構(gòu)件時(shí),構(gòu)件可以通過這三個(gè)接口分別與環(huán)境中的數(shù)據(jù)選項(xiàng)、用戶界面對(duì)象和打印機(jī)控制對(duì)象相連接,并以此實(shí)現(xiàn)與這些鏈接對(duì)象之間的交互。圖中的UserInterface和PrinterCtrl分別表示支持打印預(yù)覽和打印的用戶界面對(duì)象和打印機(jī)控制器對(duì)象,它們實(shí)際上也是兩個(gè)不同的構(gòu)件。8.2.3構(gòu)件圖的應(yīng)用舉例圖8-9數(shù)據(jù)報(bào)表構(gòu)件及其供接口和需接口8.2.3構(gòu)件圖的應(yīng)用舉例2.構(gòu)件的內(nèi)部結(jié)構(gòu)從數(shù)據(jù)報(bào)表構(gòu)件的功能進(jìn)行分析,不難設(shè)計(jì)構(gòu)件的內(nèi)部結(jié)構(gòu)。圖8-10給出了一個(gè)簡單的結(jié)構(gòu)設(shè)計(jì),其中僅包含了數(shù)據(jù)報(bào)表控件(DataReportControl)和數(shù)據(jù)集(DataCollection)兩個(gè)主要成分,其余的結(jié)構(gòu)成分則是前面提到過的幾個(gè)接口。不難看出接口與這兩個(gè)對(duì)象之間的關(guān)系。8.2.3構(gòu)件圖的應(yīng)用舉例2.構(gòu)件的內(nèi)部結(jié)構(gòu)圖8-10數(shù)據(jù)報(bào)表構(gòu)件的基本結(jié)構(gòu)8.2.3構(gòu)件圖的應(yīng)用舉例其中,數(shù)據(jù)報(bào)表控件(DataReportControl)是構(gòu)件的控制對(duì)象,它負(fù)責(zé)控制整個(gè)構(gòu)件的運(yùn)作。數(shù)據(jù)集合(DataCollection)是構(gòu)件的內(nèi)部對(duì)象,其內(nèi)容是報(bào)表中的數(shù)據(jù),數(shù)據(jù)則是實(shí)現(xiàn)了IDataItem接口的數(shù)據(jù)對(duì)象,通過DataReportControl中的Add方法可以將它們聚集到數(shù)據(jù)集合中,所有發(fā)給數(shù)據(jù)對(duì)象(DataObject)的消息則都是通過這個(gè)接口(IDataItem)實(shí)現(xiàn),并且這些消息都是從構(gòu)件的內(nèi)部對(duì)象發(fā)出的。這說明了需接口的重要作用,通過需接口使得構(gòu)件所變現(xiàn)出來的行為實(shí)際上也包括了其客戶所期望的行為,這極大地?cái)U(kuò)展了構(gòu)件的可重用性。8.2.3構(gòu)件圖的應(yīng)用舉例3.構(gòu)件與環(huán)境之間的交互構(gòu)件與環(huán)境的交互包括初始化構(gòu)件實(shí)例、添加數(shù)據(jù)以及打印和顯示報(bào)表等多種行為。下面,將分別給出這些行為的描述。1)構(gòu)件的實(shí)例化構(gòu)件的實(shí)例化過程就是創(chuàng)建構(gòu)件實(shí)例并初始化的過程,圖8-11給出了這個(gè)構(gòu)件的初始化過程,在這個(gè)過程中,創(chuàng)建了DataReportControl、IDataReport和DataCollection等對(duì)象,并向構(gòu)件中設(shè)置了構(gòu)件工作時(shí)需要的打印機(jī)控制對(duì)象和用戶界面對(duì)象。8.2.3構(gòu)件圖的應(yīng)用舉例圖8-11初始化數(shù)據(jù)報(bào)表構(gòu)件8.2.3構(gòu)件圖的應(yīng)用舉例2)創(chuàng)建數(shù)據(jù)報(bào)表創(chuàng)建數(shù)據(jù)報(bào)表是指客戶程序向構(gòu)件的數(shù)據(jù)集中添加數(shù)據(jù)并生成報(bào)表格式數(shù)據(jù)的過程,圖8-12給出了這個(gè)過程的順序圖描述,在這個(gè)過程中,既實(shí)現(xiàn)了向數(shù)據(jù)集(DataCollection)中添加了數(shù)據(jù),也實(shí)現(xiàn)了報(bào)表的生成。8.2.3構(gòu)件圖的應(yīng)用舉例圖8-12創(chuàng)建數(shù)據(jù)報(bào)表8.2.3構(gòu)件圖的應(yīng)用舉例3)打印或顯示數(shù)據(jù)報(bào)表打印和顯示數(shù)據(jù)報(bào)表是構(gòu)件的最重要的功能,這個(gè)過程的參與對(duì)象有一些不同。即用戶和用戶界面參與了這個(gè)過程,圖8-13給出了這個(gè)過程的順序圖描述,讀者可以注意圖8-13與前兩張圖的區(qū)別。8.2.3構(gòu)件圖的應(yīng)用舉例圖8-13顯示或打印數(shù)據(jù)報(bào)表8.2.3構(gòu)件圖的應(yīng)用舉例從這個(gè)過程可以看出構(gòu)件的請(qǐng)求對(duì)象不僅可以有客戶,甚至還可以由終端用戶。這使得構(gòu)件的設(shè)計(jì)更像是一個(gè)應(yīng)用程序的設(shè)計(jì),事實(shí)上,從這個(gè)實(shí)例可以看出,本案例中的構(gòu)件本身也是一種應(yīng)用程序,只不過它的使用者不僅有終端用戶,也可以有客戶程序。其設(shè)計(jì)與實(shí)現(xiàn)過程與普通的面向?qū)ο蟪绦虻脑O(shè)計(jì)與實(shí)現(xiàn)過程并沒有本質(zhì)的區(qū)別。8.2.3構(gòu)件圖的應(yīng)用舉例另外,圖8-11、圖8-12和圖8-13均忽略了用戶界面(IUserInterface)和打印控制(IPrinterControl)這兩個(gè)接口的實(shí)現(xiàn),其實(shí)它們不僅是構(gòu)件的需接口,事實(shí)上也是構(gòu)件中各種活動(dòng)過程的參與者。這種方式使得數(shù)據(jù)報(bào)表的輸出可以在不同的窗口和打印機(jī)之間進(jìn)行不同的定向,從而使得報(bào)表的輸出更加靈活。這個(gè)案例似乎很簡單,因?yàn)榘咐袃H提到了一個(gè)構(gòu)件。盡管本節(jié)中給出的關(guān)案例的全部描述都是在同一個(gè)構(gòu)件中發(fā)生的故事。當(dāng)你的設(shè)計(jì)中包含了多種不同的構(gòu)件時(shí),分析和構(gòu)造這些不同的構(gòu)件以及它們之間的關(guān)系將變得非常重要了。8.3部署圖一個(gè)完整的計(jì)算機(jī)系統(tǒng)應(yīng)包含軟件和硬件兩個(gè)方面,經(jīng)過開發(fā)得到的軟件(包括程序、數(shù)據(jù)和軟件構(gòu)件等)必須部署在硬件上才能真正發(fā)揮其應(yīng)有的作用。在UML中,通常使用部署圖描述系統(tǒng)的硬件體系結(jié)構(gòu)。部署圖由表示硬件的結(jié)點(diǎn)和結(jié)點(diǎn)之間的聯(lián)系組成,它描述了處理器、設(shè)備和軟件構(gòu)件運(yùn)行時(shí)的體系結(jié)構(gòu)。8.3.1部署圖的基本元素組成部署圖的基本元素主要有結(jié)點(diǎn)、構(gòu)件、對(duì)象、連接和依賴等。1.結(jié)點(diǎn)(Node)部署圖中,最基本的構(gòu)成元素就是結(jié)點(diǎn)。結(jié)點(diǎn)用來表示某種計(jì)算資源的物理(硬件)對(duì)象。包括計(jì)算機(jī)、外部設(shè)備(如打印機(jī)、讀卡機(jī)和通信設(shè)備)等。部署圖定義的結(jié)點(diǎn)可分為普通結(jié)點(diǎn)和設(shè)備結(jié)點(diǎn)兩種。普通結(jié)點(diǎn)是指可以部署軟件構(gòu)件或具有一定計(jì)算能力的結(jié)點(diǎn)。設(shè)備結(jié)點(diǎn)則表示具有一定輸入和輸出能力的非標(biāo)準(zhǔn)設(shè)備,其特點(diǎn)是設(shè)備結(jié)點(diǎn)上不需要部署任何軟件構(gòu)件。8.3.1部署圖的基本元素如圖8-14給出了結(jié)點(diǎn)的圖形符號(hào)表示。其中,圖8-14a給出了一個(gè)帶有某些屬性的結(jié)點(diǎn),這些屬性描述了設(shè)備應(yīng)具有的狀態(tài)。圖8-14b描述了一個(gè)普通結(jié)點(diǎn),圖8-14c則描述了一個(gè)設(shè)備結(jié)點(diǎn)。圖8-14結(jié)點(diǎn)的圖形符號(hào)表示a)帶有屬性的各節(jié)點(diǎn)b)普通結(jié)點(diǎn)c)設(shè)備節(jié)點(diǎn)8.3.1部署圖的基本元素每個(gè)結(jié)點(diǎn)都必須帶有一個(gè)名字作為標(biāo)識(shí)符,寫在立方體中間。結(jié)點(diǎn)名還可以帶有路徑且應(yīng)具有唯一性。每種結(jié)點(diǎn)都可以帶有某些屬性,用于描述設(shè)備應(yīng)具有的狀態(tài)或應(yīng)滿足的約束條件。結(jié)點(diǎn)還可以帶有方法,用于描述需要在該結(jié)點(diǎn)上部署的構(gòu)件。8.3.1部署圖的基本元素2.構(gòu)件(Component)可執(zhí)行構(gòu)件的實(shí)例可以出現(xiàn)在部署圖中的結(jié)點(diǎn)實(shí)例圖形符號(hào)中,表示構(gòu)件實(shí)例與結(jié)點(diǎn)實(shí)例之間的部署關(guān)系。圖8-15描述了一個(gè)圖書管理系統(tǒng)的部署圖實(shí)例。圖中包含了6個(gè)結(jié)點(diǎn)和3個(gè)設(shè)備結(jié)點(diǎn)。其中,DatabaseServer是數(shù)據(jù)庫服務(wù)器,其部署的構(gòu)件是數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng)。ApplicationServer是一個(gè)應(yīng)用服務(wù)器,用于部署Web服務(wù)程序。BookBorrowingTerminal是一個(gè)圖書借閱終端,部署圖書借閱管理程序,主要負(fù)責(zé)借書和還書業(yè)務(wù)。InformationInquiryTerminal為圖書信息查詢終端,與應(yīng)用服務(wù)器相連,主要提供各種信息查詢。InformationCollectionTerminal圖書信息采編終端,主要用于圖書采編等業(yè)務(wù)。8.3.1部署圖的基本元素圖8-15圖書管理系統(tǒng)的部署圖8.3.1部署圖的基本元素另外,圖中還包含了圖書借閱系統(tǒng)(BookBorrowingSystem)、數(shù)據(jù)庫管理系統(tǒng)(DatabaseManagementSystem)、圖書信息采編系統(tǒng)(BookInformationCollectingSystem)和圖書信息查詢系統(tǒng)(BookInformationInquirySystem)等四個(gè)子系統(tǒng)。這四個(gè)構(gòu)件與結(jié)點(diǎn)之間的部署關(guān)系也被直觀地表示出來。8.3.1部署圖的基本元素3.結(jié)點(diǎn)之間的關(guān)系實(shí)際的系統(tǒng)中,各個(gè)結(jié)點(diǎn)之間是通過物理連接發(fā)生聯(lián)系的,以便從硬件方面保證系統(tǒng)各結(jié)點(diǎn)之間的協(xié)同運(yùn)行,連接方式可以多種多樣,例如RS232,局域網(wǎng)、因特網(wǎng)等。部署圖中的連接元素主要包括:結(jié)點(diǎn)之間的關(guān)聯(lián)和結(jié)點(diǎn)與構(gòu)件之間的依賴兩種關(guān)系。1)結(jié)點(diǎn)之間的通信關(guān)聯(lián)結(jié)點(diǎn)通過通信關(guān)聯(lián)用一條直線表示,表示出結(jié)點(diǎn)之間存在某種通信路徑。通過這條通信路徑,結(jié)點(diǎn)間可交換對(duì)象或發(fā)送信息。通信關(guān)聯(lián)上可以帶有標(biāo)明其某種特殊語義的(如連接方式)構(gòu)造型,如《TCP/IP》和《Ethernet》等。8.3.1部署圖的基本元素圖8-16部署圖中的依賴關(guān)系8.3.1部署圖的基本元素2)依賴關(guān)系部署圖中的依賴關(guān)系主要描述構(gòu)件圖中各要素之間的依賴,主要包括:表示結(jié)點(diǎn)和構(gòu)件之間的部署關(guān)系的依賴,不同結(jié)點(diǎn)上的構(gòu)件或?qū)ο笾g的遷移依賴。部署依賴是指表示構(gòu)件是否可以或是否需要部署到某個(gè)結(jié)點(diǎn)的依賴,這可以使用帶有《deploy》或《support》構(gòu)造型的依賴表示。對(duì)于分布在不同結(jié)點(diǎn)上的構(gòu)件或?qū)ο笾g的遷移關(guān)系可以使用帶有《become》構(gòu)造型的依賴加以描述。8.3.1部署圖的基本元素一個(gè)基本的網(wǎng)絡(luò)應(yīng)用系統(tǒng)部署模型的建模方法如下:1.確定結(jié)點(diǎn)2.定義構(gòu)件在結(jié)點(diǎn)上的分布3.明確結(jié)點(diǎn)的特征4.明確結(jié)點(diǎn)之間的關(guān)系5.繪制配置圖8.3.1部署圖的基本元素一個(gè)基本的網(wǎng)絡(luò)應(yīng)用系統(tǒng)部署模型的建模方法如下:1.確定結(jié)點(diǎn)綜合考慮項(xiàng)目的目標(biāo)、規(guī)模、地理分布以及所選的軟件體系結(jié)構(gòu)等因素,定義所需要的結(jié)點(diǎn)。常見的結(jié)點(diǎn)包括服務(wù)器、工作站、交換機(jī)、網(wǎng)絡(luò)設(shè)備和某些特殊輸入/輸出設(shè)備,一般不考慮鼠標(biāo)、鍵盤和顯示器等標(biāo)準(zhǔn)設(shè)備。一般情況下,可將每種(或具有某種特殊用途的)計(jì)算機(jī)或設(shè)備作為一個(gè)結(jié)點(diǎn),一個(gè)設(shè)備也看作一個(gè)結(jié)點(diǎn),設(shè)備一般沒有計(jì)算能力(不能執(zhí)行構(gòu)件),但它們往往是系統(tǒng)與外界交互的重要接口。對(duì)于服務(wù)器,還需要根據(jù)它們所提供的服務(wù)的類型將它們劃分成多種不同的類型,如數(shù)據(jù)庫、應(yīng)用、通信和視頻服務(wù)器等。8.3.1部署圖的基本元素2.定義構(gòu)件在結(jié)點(diǎn)上的分布根據(jù)軟件體系結(jié)構(gòu)和系統(tǒng)功能要求將構(gòu)件分配到不同的軟件結(jié)點(diǎn)上,并用構(gòu)件圖描述出來。3.明確結(jié)點(diǎn)的特征根據(jù)結(jié)點(diǎn)的用途、計(jì)算能力和處理能力等方面的特性和要求,分析清楚每個(gè)結(jié)點(diǎn)應(yīng)具有的特征,必要時(shí)可使用結(jié)點(diǎn)的屬性、操作和構(gòu)造型來描述這些結(jié)點(diǎn)所應(yīng)有的性質(zhì)。8.3.1部署圖的基本元素4.明確結(jié)點(diǎn)之間的關(guān)系對(duì)于結(jié)點(diǎn)之間的簡單通信聯(lián)系,可直接用關(guān)聯(lián)描述,并標(biāo)明關(guān)聯(lián)使用的連接類型,如通信協(xié)議或網(wǎng)絡(luò)類型等。對(duì)于分布式系統(tǒng),還要注意各結(jié)點(diǎn)上駐留的構(gòu)件或?qū)ο笾g可能存在的遷移的依賴聯(lián)系,并用構(gòu)造型《become》加以說明。8.3.1部署圖的基本元素5.繪制配置圖對(duì)于一個(gè)比較簡單的系統(tǒng),可僅繪制一張部署圖就可以了。但對(duì)于復(fù)雜系統(tǒng),可以按照分治策略對(duì)結(jié)點(diǎn)進(jìn)行分組的方式進(jìn)行部署圖的建模。即將部署模型分成多個(gè)包的方式進(jìn)行建模,從而形成結(jié)構(gòu)清晰的具有層次結(jié)構(gòu)形式的部署模型。此時(shí)應(yīng)注意包中結(jié)點(diǎn)名稱的唯一性,還要注意包間的聯(lián)系的問題。8.3.3部署圖的應(yīng)用舉例本小節(jié)討論一個(gè)關(guān)于供水監(jiān)控系統(tǒng)項(xiàng)目的部署圖設(shè)計(jì)問題。該供水監(jiān)控系統(tǒng)的目標(biāo)是以無線通信的方式實(shí)現(xiàn)對(duì)分布在一個(gè)直徑為幾十公里的地域范圍內(nèi)的多個(gè)水泵實(shí)現(xiàn)遠(yuǎn)程監(jiān)控,以確保實(shí)現(xiàn)對(duì)用水單位的持續(xù)供水,滿足用水單位的用水需求。系統(tǒng)工作時(shí),主要檢測(cè)每臺(tái)與水泵相連接的電機(jī)的狀態(tài),并根據(jù)電機(jī)的狀態(tài)以及狀態(tài)變化做出及時(shí)的控制決策,以避免因不正常的狀態(tài)或狀態(tài)變化造成設(shè)備故障或損壞而造成損失。8.3.3部署圖的應(yīng)用舉例為實(shí)現(xiàn)這樣一個(gè)目標(biāo),人們開發(fā)了一個(gè)供水監(jiān)控系統(tǒng),該系統(tǒng)的主要功能包括:遠(yuǎn)程啟動(dòng)、遠(yuǎn)程關(guān)機(jī)、水泵狀態(tài)監(jiān)控以及運(yùn)行日志管理等功能。其中,遠(yuǎn)程啟動(dòng)指啟動(dòng)特定的水泵,使水泵處于供水狀態(tài);遠(yuǎn)程關(guān)機(jī)指關(guān)閉指定的水泵,使該水泵處于停機(jī)狀態(tài);遠(yuǎn)程監(jiān)控是指實(shí)時(shí)監(jiān)測(cè)每一臺(tái)水泵的運(yùn)行狀態(tài),當(dāng)水泵處于某種臨界狀態(tài)時(shí),自動(dòng)報(bào)警并關(guān)閉水泵。8.3.3部署圖的應(yīng)用舉例根據(jù)系統(tǒng)應(yīng)有的功能及其地域分布的特點(diǎn),人們還設(shè)計(jì)了這個(gè)系統(tǒng)的物理結(jié)構(gòu)。結(jié)構(gòu)中,使用一臺(tái)工業(yè)控制機(jī)(IndustrialcontrolPC)和一臺(tái)通信控制器(CommunicationController)作為中心節(jié)點(diǎn)、使用了多個(gè)通信終端(CommunicationTerminal)和水泵狀態(tài)傳感器(Motorstatussensor)等多個(gè)設(shè)備與每一臺(tái)水泵電機(jī)相連。其中,工業(yè)控制機(jī)和通信控制器之間是一一對(duì)應(yīng)的關(guān)系,通信接收終端和水泵狀態(tài)傳感器之間也是一一對(duì)應(yīng)的關(guān)系,而通信控制器和通信接收終端之間是一對(duì)多的關(guān)系,通信接收終端的數(shù)量則不小于現(xiàn)場(chǎng)連接的水泵的數(shù)量。8.3.3部署圖的應(yīng)用舉例圖8-17中的部署圖就清晰地描述了這個(gè)監(jiān)測(cè)系統(tǒng)的物理結(jié)構(gòu),同時(shí)也清楚地描述了系統(tǒng)的軟件構(gòu)件(如WaterProject.exe和DailyRecordOfWork)在這些節(jié)點(diǎn)上的部署情況。圖8-17部署圖的應(yīng)用舉例8.3.3部署圖的應(yīng)用舉例從這個(gè)例子可以看出,部署圖具有結(jié)構(gòu)比較簡單的特點(diǎn),它們通常不包含過多的技術(shù)細(xì)節(jié)。其作用也是比較重要的,它可以使人一目了然地看清楚系統(tǒng)的結(jié)構(gòu),甚至能看出系統(tǒng)的運(yùn)作情況。8.4小結(jié)本章介紹了UML包圖、構(gòu)件圖和部署圖等三種圖。對(duì)于包圖,值得注意的是包和包圖是兩個(gè)不同的概念。包是一種模型分組機(jī)制,一個(gè)完整的UML模型通??梢钥闯墒且粋€(gè)包,這個(gè)包中包含了該模型的所有內(nèi)容。這個(gè)包中的內(nèi)容又可以劃分成若干個(gè)子包。一個(gè)模型中的所有包和模型元素共同構(gòu)成了一個(gè)完整的UML模型。包圖則是描述模型中的包以及包間關(guān)系的一種UML圖。為人們提供了用于觀察包結(jié)構(gòu)方面的視圖。在具體的建模工具(如EnterpriseArchitect)中,包圖還起著在模型之中導(dǎo)航的作用。8.4小結(jié)構(gòu)件圖描述了目標(biāo)系統(tǒng)的軟件構(gòu)件及這些構(gòu)件之間的關(guān)系,構(gòu)件圖可以看成是目標(biāo)軟件的物理結(jié)構(gòu),也是對(duì)軟件功能結(jié)構(gòu)的一種劃分和實(shí)現(xiàn)。在具體的建模工具中,如RationalRose,構(gòu)件還可以作為正向工程的操作對(duì)象的作用。構(gòu)件則可以看成是邏輯結(jié)構(gòu)模型中定義的概念和功能(如類、對(duì)象及它們間的關(guān)系和協(xié)作)在物理體系結(jié)構(gòu)中的實(shí)現(xiàn),它們通常是開發(fā)環(huán)境中的實(shí)現(xiàn)性文件。部署圖描述的則是系統(tǒng)的硬件體系結(jié)構(gòu),部署圖由處理器節(jié)點(diǎn)、設(shè)備結(jié)點(diǎn)以及結(jié)點(diǎn)之間的聯(lián)系組成。在這個(gè)體系結(jié)構(gòu)中,也可以看到結(jié)點(diǎn)上部署的構(gòu)件,以及這些構(gòu)件中包含了哪些結(jié)構(gòu)元素(如類、對(duì)象和協(xié)作等)。第9章UML模型與程序設(shè)計(jì)學(xué)習(xí)目標(biāo)
通過對(duì)各種元素到應(yīng)用程序映射規(guī)律的討論,理解和掌握軟件建模與系統(tǒng)實(shí)現(xiàn)之間的關(guān)系
重點(diǎn)掌握類圖模型中的類、關(guān)系等模型元素到程序代碼的映射方法
理解和掌握UML中順序圖到程序代碼的映射方法
理解和掌握UML中狀態(tài)圖到程序代碼的映射方法第9章UML模型與程序設(shè)計(jì)軟件開發(fā)過程中,在完成了軟件建模之后,接下來的工作就是將這些模型轉(zhuǎn)換成具體的程序設(shè)計(jì)語言代碼。常見的做法是,使用建模軟件中的“正向工程”功能將模型中的結(jié)構(gòu)模型轉(zhuǎn)換成相應(yīng)的應(yīng)用程序框架代碼,程序設(shè)計(jì)人員可以此框架代碼為基礎(chǔ),添加模型中尚未實(shí)現(xiàn)的細(xì)節(jié),完成系統(tǒng)的程序設(shè)計(jì)。目前,大多數(shù)UML建模軟件,還不能將所有的模型元素以自動(dòng)化的方式轉(zhuǎn)換成程序代碼,普遍能夠自動(dòng)轉(zhuǎn)換的可能僅有類圖模型。盡管如此,各種模型中的模型元素與應(yīng)用程序之間仍然存在著千絲萬縷的聯(lián)系。使用UML模型建模一個(gè)軟件,可以為開發(fā)人員生成一個(gè)較為完善的程序代碼框架。同時(shí),UML中的各種圖形化模型也為開發(fā)人員設(shè)計(jì)和實(shí)現(xiàn)目標(biāo)系統(tǒng)提供了直觀且無二義性的支持作用。第9章UML模型與程序設(shè)計(jì)UML模型中,類和類圖是最重要的模型元素,它們描述了構(gòu)建目標(biāo)系統(tǒng)所需要的類和類之間的關(guān)系、這些類所具有的屬性和方法,同時(shí)也包括了這些元素之上的各種約束。盡管UML中定義了種類繁多的模型元素,但它們中的大多數(shù)都是面向軟件開發(fā)人員的。本章將以C++程序設(shè)計(jì)語言為例,討論UML模型向程序代碼映射的基本原理和基本方法,重點(diǎn)討論類圖到C++類的映射,其中包括類之間各種關(guān)系的映射。最后,再簡單討論一下模型中的順序圖、通信圖、活動(dòng)圖和狀態(tài)圖等模型到C++程序的映射。9.1類的映射從靜態(tài)結(jié)構(gòu)的角度來看,任何一個(gè)C++程序均可看成是一個(gè)由多個(gè)類的定義和實(shí)現(xiàn)構(gòu)成的集合。因此,將一個(gè)UML模型映射到C++程序的本質(zhì),就是將在UML中定義的類轉(zhuǎn)換成C++程序表示的類。為了敘述方便,本書將UML類圖中的類簡稱為UML類,而將C++中的類簡稱為C++類。9.1.1C++類的基本結(jié)構(gòu)C++程序中,類的定義通常由類名、數(shù)據(jù)成員和函數(shù)成員等三個(gè)部分組成。C++程序設(shè)計(jì)語言通常將每個(gè)類的描述分為定義和實(shí)現(xiàn)兩個(gè)部分,類的定義部分從整體上描述類的基本結(jié)構(gòu)及其與相關(guān)類之間的關(guān)系,存放在類定義文件(擴(kuò)展名為.h文件)中。而類的實(shí)現(xiàn)部分則是類中每個(gè)函數(shù)成員的具體實(shí)現(xiàn),一般情況下存放在類的實(shí)現(xiàn)文件(擴(kuò)展名為.cpp文件)中。9.1.1C++類的基本結(jié)構(gòu)類的結(jié)構(gòu)元素包括:(1)類名:C++中的類等同于類型,類名實(shí)際上也是一個(gè)類型聲明符,可用它聲明對(duì)象。(2)數(shù)據(jù)成員:也就是類屬性,C++類可以沒有數(shù)據(jù)成員,也可以有多個(gè)數(shù)據(jù)成員。(3)函數(shù)成員:即所謂的類方法,C++類中的成員函數(shù)分為函數(shù)聲明和函數(shù)實(shí)現(xiàn)。函數(shù)聲明屬于類定義,存放在類的定義文件中。函數(shù)實(shí)現(xiàn)則屬于類的實(shí)現(xiàn)部分,存放在類的實(shí)現(xiàn)文件中。實(shí)際上,函數(shù)成員描述了一個(gè)類的對(duì)象所能提供的服務(wù)。一個(gè)類可包含多個(gè)成員函數(shù)。9.1.1C++類的基本結(jié)構(gòu)C++對(duì)類的數(shù)據(jù)成員和函數(shù)成員都提供了可見性定義,C++中的可見性分為私有(private),受護(hù)(protected)和公有(public)等三種類型。9.1.2UML類到C++類的映射在將一個(gè)UML類映射為相應(yīng)的C++類時(shí),通常分別生成一個(gè)頭文件和一個(gè)實(shí)現(xiàn)文件。頭文件應(yīng)給出類的定義部分,包括類名、數(shù)據(jù)成員和函數(shù)成員的聲明部分。實(shí)現(xiàn)文件則應(yīng)給出這個(gè)類的框架(無具體實(shí)現(xiàn)代碼的成員函數(shù)),其具體實(shí)現(xiàn)細(xì)節(jié)則由程序人員自行設(shè)計(jì)和添加,或由某種建模軟件根據(jù)模型中的其他信息自動(dòng)生成。9.1.2UML類到C++類的映射例如,圖9-1給出了一個(gè)CLine類,其中定義了兩個(gè)數(shù)據(jù)成員和三個(gè)函數(shù)成員??芍庇^地看出其所有成員的可見性。由這個(gè)UML類生成的C++代碼如下所示:圖9-1CLine類//File:CLine.hclassCLine:publicCGraphElement{public:
CLine();
virtual~CLine();
voidShift(intdy,intdx);
voidRotate(doublealpha);
voidDraw(CDC*pDC);private:
CPointstart,end;};//File:CLine.cpp#include"CLine.h"CLine::CLine(){}CLine::~CLine(){}voidCLine::Shift(intdy,intdx){}voidCLine::Rotate(doublealpha){}voidCLine::Draw(CDC*pDC){}9.1.2UML類到C++類的映射CLine類的映射非常簡單,其中只包含了屬性的映射和方法的映射。實(shí)際上,UML類的映射遠(yuǎn)比這里所描述的復(fù)雜得多,類之間通常存在著泛化、關(guān)聯(lián)(聚合、組合)和依賴等關(guān)系。在將UML類映射為C++類時(shí),類之間的這些關(guān)系也必須進(jìn)行映射。9.1.3屬性和方法的映射UML通常使用各種修飾符或?qū)傩灾祦砻枋鲱悓傩院头椒ǖ目梢娦浴⒆饔糜?、抽象類、抽象方法等方面的特性或約束。C++類中,屬性和方法的可見性定義與UML類中的可見性定義完全相同,不同的僅僅是表示符號(hào)不同而已。C++使用靜態(tài)成員表示具有類作用域的屬性和方法。C++類中,靜態(tài)成員的含義與UML類中類作用域的含義完全一致。同樣,UML類中實(shí)例作用域的含義與C++類中的普通成員的含義也是相同的。9.1.3屬性和方法的映射表9-1常見的UML類修飾符以及對(duì)應(yīng)的C++表示方法類特性UML修飾符C++關(guān)鍵字說明可見性公共+public表示屬性或方法對(duì)任何類均是可見的私有-private表示屬性或方法只在本類中可見保護(hù)#protected表示屬性或方法只在本類及派生類中可見作用域?qū)嵗J(rèn))默認(rèn)C++類的成員默認(rèn)為實(shí)例作用域類(下劃線)staticC++類用靜態(tài)成員表示類作用域抽象操作斜體方法名或abstract純虛函數(shù)C++用純虛函數(shù)表示抽象操作virtual類型名方法名([參數(shù)表])=0抽象類斜體類名
C++用含有純虛函數(shù)或?qū)?gòu)造函數(shù)可見性置為protected的方法表示抽象類方法修飾符QueryconstC++用const關(guān)鍵字表示只讀操作,只讀操作不修改對(duì)象屬性值Update默認(rèn)C++類的操作的默認(rèn)屬性,使用const關(guān)鍵字表示只讀操作,只讀操作不修改對(duì)象屬性值參數(shù)修飾符inconst不允許在方法中修改參數(shù)的值或狀態(tài)out或inoutconst&允許在方法中對(duì)參數(shù)作任何操作9.1.3屬性和方法的映射可以把類作用域方法(靜態(tài)成員函數(shù))看成是為類(類的對(duì)象集合)提供的服務(wù),而不是專門為這個(gè)類的某個(gè)實(shí)例提供的服務(wù)。因此,這些方法并不與特定的對(duì)象相聯(lián)系,當(dāng)然也不能直接訪問該類的任何實(shí)例和具有實(shí)例作用域的方法。UML類中使用斜體方法名或abstract關(guān)鍵字表示抽象類,C++類則純虛函數(shù)或?qū)?gòu)造函數(shù)定義成保護(hù)或私有可見性的方法定義抽象類。二者在表示方法上略有不同,但二者的含義是相同的。如果UML抽象類中不包含抽象方法,那么映射時(shí)應(yīng)將對(duì)應(yīng)的C++類的構(gòu)造函數(shù)的可見性置為保護(hù)或私有。這樣,將會(huì)使得這個(gè)類因不能實(shí)例化而變成抽象類。9.1.3屬性和方法的映射將UML類中的抽象操作映射到C++類時(shí),可使用帶有virtual關(guān)鍵字的純虛函數(shù)表示,純虛函數(shù)的語法形式表示為:virtual類型名方法名([參數(shù)表])=0。在這一點(diǎn)上,二者的表示法和語義也是相同的。其共同特征是:基類中都沒有給出相應(yīng)的實(shí)現(xiàn),其實(shí)現(xiàn)被推遲到它的某個(gè)派生類。包含抽象操作的類本身就是抽象類,它不能被實(shí)例化。另外,UML類中某些方法的特性中可能會(huì)出現(xiàn)query或update關(guān)鍵字。特性query的含義是該方法的執(zhí)行不會(huì)修改該對(duì)象的任何屬性值,即它對(duì)對(duì)象屬性的訪問時(shí)只讀的。與此相對(duì)的是,特性u(píng)pdate表明該方法可以修改對(duì)象中的屬性值,即它可以對(duì)對(duì)象中的屬性進(jìn)行讀寫訪問。9.1.3屬性和方法的映射C++類操作的默認(rèn)特性是讀寫的,類操作的query特性可以用帶有const關(guān)鍵字的成員函數(shù)表示。C++類中被聲明為const的成員函數(shù),只能對(duì)對(duì)象中的數(shù)據(jù)成員進(jìn)行只讀訪問而不進(jìn)行寫訪問。任何不帶有const關(guān)鍵字的成員函數(shù)被看成是需要修改對(duì)象數(shù)據(jù)成員的函數(shù),而且編譯程序不允許為一個(gè)const對(duì)象調(diào)用這個(gè)函數(shù)。如果僅僅在類頭中將一個(gè)函數(shù)聲明為const,那么就不能保證成員函數(shù)也是這樣定義的,所以編譯程序迫使程序人員在定義函數(shù)時(shí)要重申const說明。為確保函數(shù)的只讀特性,在const函數(shù)中,任何一個(gè)修改成員變量值的語句或非const成員函數(shù)的調(diào)用都會(huì)觸發(fā)一個(gè)編譯錯(cuò)誤,以保證函數(shù)對(duì)對(duì)象狀態(tài)的保護(hù)作用。9.1.3屬性和方法的映射在UML類中,每個(gè)方法可帶有若干個(gè)形式參數(shù),每個(gè)參數(shù)的語法形式如下:參數(shù)類別形式參數(shù)名:類型[=默認(rèn)值];其中參數(shù)類別的取值可以包括{in,out,inout}三個(gè)選項(xiàng),用于表示參數(shù)的可修改性語義。參數(shù)類別取值為in時(shí),表示在方法內(nèi)只能對(duì)這個(gè)參數(shù)進(jìn)行讀訪問,而不能進(jìn)行寫訪問;當(dāng)參數(shù)類別為out時(shí),表明該參數(shù)為輸出參數(shù),在方法體內(nèi)可調(diào)用參數(shù)對(duì)象的寫訪問;當(dāng)類別為inout時(shí),表明方法體內(nèi)可對(duì)參數(shù)它進(jìn)行任何訪問。9.1.3屬性和方法的映射在C++中,可用關(guān)鍵字const限定函數(shù)參數(shù)的可修改性。如果函數(shù)中出現(xiàn)了對(duì)const類型的參數(shù)進(jìn)行寫操作語句,那么編譯程序會(huì)給出一個(gè)出錯(cuò)信息。構(gòu)造函數(shù)和析構(gòu)函數(shù)是兩種特殊方法。程序在創(chuàng)建對(duì)象時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),以便完成對(duì)象的初始化工作。在C++中,構(gòu)造函數(shù)名必須與類名相同,它沒有返回值。析構(gòu)函數(shù)也用類的名做函數(shù)名,只不過前面加一個(gè)特殊符號(hào)“~”以便和構(gòu)造函數(shù)區(qū)分開。它不帶任何參數(shù),也沒有返回值,其目的是用來為對(duì)象做一些清除性的工作。9.1.3屬性和方法的映射在映射時(shí),如果在UML類中沒有用衍型?constructor?和?destructor?修飾方法,那么一般應(yīng)自動(dòng)生成默認(rèn)的構(gòu)造函數(shù)和析構(gòu)函數(shù)。在C++中,復(fù)制構(gòu)造函數(shù)采用相同類型的對(duì)象引用作為它的參數(shù),它可用來從現(xiàn)有的對(duì)象創(chuàng)建新的對(duì)象。當(dāng)用傳值方式傳遞或返回一個(gè)對(duì)象時(shí),編譯程序就自動(dòng)調(diào)用該復(fù)制函數(shù)。如果UML類涉及指針的管理,那么為保證對(duì)指針進(jìn)行正確的操作,同時(shí)還應(yīng)自動(dòng)生成復(fù)制構(gòu)造函數(shù)及進(jìn)行“=”操作符重載。9.1.3屬性和方法的映射當(dāng)UML類中存在抽象方法,即相應(yīng)的C++類包含虛函數(shù)時(shí),那么在映射時(shí)應(yīng)自動(dòng)生成虛析構(gòu)函數(shù)而不是默認(rèn)的析構(gòu)函數(shù)。當(dāng)UML類中包含子類時(shí),父類映射所得的C++類的析構(gòu)函數(shù)也應(yīng)為虛析構(gòu)函數(shù),虛析構(gòu)函數(shù)的目的是保證正確地清除對(duì)象。9.1.3屬性和方法的映射因此,在把UML類映射為C++類時(shí),一般應(yīng)遵循如下映射規(guī)則。(1)類、屬性和方法的映射根據(jù)類圖中定義的類名、屬性及方法定義類。包括類的定義和類的實(shí)現(xiàn)。了定義存放在頭文件中,類實(shí)現(xiàn)存放在.cpp文件中。(2)可見性的映射將UML類中用+、-與#修飾的屬性或方法分別映射成帶有public,private與protected等關(guān)鍵字?jǐn)?shù)據(jù)成員或成員函數(shù)。9.1.3屬性和方法的映射因此,在把UML類映射為C++類時(shí),一般應(yīng)遵循如下映射規(guī)則。(1)類、屬性和方法的映射根據(jù)類圖中定義的類名、屬性及方法定義類。包括類的定義和類的實(shí)現(xiàn)。了定義存放在頭文件中,類實(shí)現(xiàn)存放在.cpp文件中。(2)可見性的映射將UML類中用+、-與#修飾的屬性或方法分別映射成帶有public,private與protected等關(guān)鍵字?jǐn)?shù)據(jù)成員或成員函數(shù)。9.1.3屬性和方法的映射(3)作用域映射將UML類中的具有類作用域的屬性或方法分別映射成帶有static關(guān)鍵字的靜態(tài)數(shù)據(jù)或函數(shù)成員。(4)構(gòu)造函數(shù)和析構(gòu)函數(shù)在C++類中添加默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)。(5)抽象方法映射將UML類中的抽象方法(方法名為斜體或后面帶有abstract關(guān)鍵字)映射成純虛函數(shù)。9.1.3屬性和方法的映射(6)設(shè)置成員函數(shù)的只讀屬性將UML類中query特性為真的方法映射成帶有const關(guān)鍵字的方法,同時(shí)將UML類方法形式參數(shù)帶有的{in,out,inout}中的具體選項(xiàng)映射成對(duì)應(yīng)的C++類成員函數(shù)的形式參數(shù)。設(shè)UML類中某個(gè)參數(shù)的數(shù)據(jù)類型為T,則其具體映射方法如下:①若參數(shù)的類別為in,則應(yīng)將該參數(shù)類型映射為constT&;②若參數(shù)的類別為out或inout,則可將該參數(shù)類型映射為T&;9.1.3屬性和方法的映射(7)帶有泛化關(guān)系的UML類的映射若映射的UML類之間存在泛化關(guān)系,則將相應(yīng)C++類的析構(gòu)函數(shù)設(shè)置成虛函數(shù)。(8)抽象類的映射若UML類是一個(gè)抽象類,則構(gòu)造函數(shù)的可見性將被映射為保護(hù)的(protected)。9.1.3屬性和方法的映射圖9-2中的類圖中包含了文檔CGraphicDocument、圖形元素CGraphElement、直線Cline和圓CCircle等四個(gè)類,還包含了兩個(gè)繼承和一個(gè)關(guān)聯(lián)關(guān)系。圖9-2圖形文檔結(jié)構(gòu)類9.1.3屬性和方法的映射按照上述規(guī)則,從這個(gè)類圖生成的C++程序代碼如下。1)CGraphicDocument類的定義與實(shí)現(xiàn)
//CGraphicDocument.h#include"CGraphElement.h"classCGraphicDocument{public:
CGraphicDocument();
virtual~CGraphicDocument();
voidSave(CArchivear);
voidAdd(CAgrphicElement&e);
CGraphElement*m_CGraphElement;};//CGraphicDocument.cpp#include"CGraphicDocument.h"CGraphicDocument::CGraphicDocument(){}CGraphicDocument::~CGraphicDocument(){}voidCGraphicDocument::Save(CArchivear){}voidCGraphicDocument::Add(CGraphElement&e){}9.1.3屬性和方法的映射2)CGraphElement類的定義與實(shí)現(xiàn)
//CGraphElement.hclassCGraphElement{public:CGraphElement();virtual~CGraphElement();protected:intLineStyle,intLineWidth;COLORREFLineColor;voidDraw(CDC*pDC);voidShift(intdx,intdy);voidRotate(doubleAlpha);};//CGraphElement.cpp#include"CGraphElement.h"CGraphElement::CGraphElement(){}CGraphElement::~CGraphElement(){}voidCGraphElement::Draw(CDC*pDC){}voidCGraphElement::Shift(intdx,intdy){}voidCGraphElement::Rotate(doubleAlpha){}9.1.3屬性和方法的映射3)CCircle類的定義與實(shí)現(xiàn)
//CCircle.h#include"CGraphElement.h"classCCircle:publicCGraphElement{public:CCircle();virtual~CCircle();voidDraw(CDC*pDC);voidShift(dx,intdy);voidRotate(doublealpha);private:CPointCenter;intRadius;COLORREFFaceColor;intFaceStyle;};//CCircle.cpp#include"CGraphElement.h"#include"CCircle.h"CCircle::CCircle(){}CCircle::~CCircle(){}voidCCircle::Draw(CDC*pDC){}voidCCircle::Shift(dx,intdy){}voidCCircle::Rotate(doublealpha){}9.1.3屬性和方法的映射4)CLine類的定義與實(shí)現(xiàn)
//Cline.h#include"CGraphElement.h"classCLine:publicCGraphElement{public:CLine();virtual~CLine();voidShift(intdy,intdx);voidRotate(doublealpha);voidDraw(CDC*pDC);private:CPointstart,end;};//CLine.cpp#include"CLine.h"CLine::CLine(){}CLine::~CLine(){}voidCLine::Shift(intdy,intdx){}voidCLine::Rotate(doublealpha){}voidCLine::Draw(CDC*pDC){}9.1.3屬性和方法的映射容易看出,這些代碼雖然給出了完整的類定義,但卻僅僅生成了一系列的空方法,這些空方法的實(shí)現(xiàn)則被留給了程序員。這時(shí),模型中關(guān)于各種模型元素的描述細(xì)節(jié)將成為程序員編程的重要依據(jù)。9.2泛化關(guān)系的映射在面向?qū)ο笤O(shè)計(jì)方法中,泛化關(guān)系用于從一個(gè)類中派生出新的類,即向一個(gè)泛化類中添加新的信息或?qū)ζ溥M(jìn)行修改而得到新的特化類。C++中,與泛化關(guān)系對(duì)應(yīng)的機(jī)制是繼承關(guān)系,C++不僅支持繼承,而且還支持多繼承的設(shè)計(jì)。繼承提供了一種能夠促進(jìn)代碼共享、復(fù)用和擴(kuò)展的重要機(jī)制。在繼承關(guān)系中,不僅可以在基類的基礎(chǔ)上定義派生類,而且還可以在派生類中添加新的數(shù)據(jù)成員和函數(shù)成員。更重要的是,C++還提供了一種虛函數(shù)機(jī)制,以便在派生類中覆蓋基類中的某些成員函數(shù)。C++規(guī)定,在派生類中可以重新定義那些在基類中被聲明為虛函數(shù)的成員函數(shù)。9.2泛化關(guān)系的映射在C++中,還定義了公有、私有和保護(hù)等多種繼承方式,派生類可按公有方式繼承基類,也可按私有方式或受保護(hù)的方式繼承基類。1.公有繼承(public)公有繼承的特點(diǎn)是基類的公有成員和保護(hù)成員作為派生類的成員時(shí),它們都保持原有的可見性,而基類的私有成員仍然是私有的,不能被這個(gè)派生類的子類所訪問。9.2泛化關(guān)系的映射2.私有繼承(private)私有繼承的特點(diǎn)是基類的公有成員和保護(hù)成員都可以被派生類繼承,但它們?cè)谂缮愔械目梢娦员欢x為私有的,所以它們也不能被這個(gè)派生類的子類訪問。9.2泛化關(guān)系的映射3.保護(hù)繼承(protected)保護(hù)繼承的特點(diǎn)是派生類繼承基類的所有公有成員和保護(hù)成員,并把它們定義為派生類的保護(hù)成員,當(dāng)然可以被它的派生類或友元訪問,基類的私有成員仍然是基類私有的。在將UML類中的泛化關(guān)系映射為C++類中的繼承關(guān)系時(shí),一般選擇公有繼承。9.2泛化關(guān)系的映射在多繼承的情況下,有時(shí)會(huì)出現(xiàn)重復(fù)繼承的情況發(fā)生,如圖9-3中的GraduateStudentOnJob類(在職研究生)就重復(fù)地繼承了Person類(人員)的屬性,這可能會(huì)導(dǎo)致了派生類中屬性的冗余。圖9-3多繼承中的重復(fù)繼承9.2泛化關(guān)系的映射C++定義了一種被稱為虛繼承的方式來解決這個(gè)問題。當(dāng)使用虛繼承時(shí),不論從派生類到其超類有幾條繼承路徑,派生類都將僅一次性地繼承其虛基類的屬性,這樣就可以有效地避免因多繼承產(chǎn)生的冗余所導(dǎo)致的不一致性。當(dāng)然,必要時(shí)也可以不使用虛繼承。為簡單起見,在將泛化關(guān)系向繼承關(guān)系映射時(shí),應(yīng)讓所有的派生類都以虛繼承的方式描述它從基類中的繼承。9.2泛化關(guān)系的映射將圖9-3中的多繼承映射到C++后生成的程序代碼如下所示,得到的這些代碼中,所有類之間的繼承就都使用了虛繼承方式來定義這些類之間的泛化。classPerson{public:
Person();
virtual~Person();private:
char*PersonID;
char*Name;};classTeacher:virtualpublicPerson{public:
Teacher();
virtual~Teacher();private:
char*TeacherID;
char*Specialities;};9.2泛化關(guān)系的映射將圖9-3中的多繼承映射到C++后生成的程序代碼如下所示,得到的這些代碼中,所有類之間的繼承就都使用了虛繼承方式來定義這些類之間的泛化。classGraduateStudent:virtualpublicPerson{public:
GraduateStudent();
virtual~GraduateStudent();private:
char*StudentID;
char*Director;};classGraduateStudentOnJob:virtualpublicTeacher,virtualpublicGraduateStudent{public:
GraduateStudentOnJob();
virtual~GraduateStudentOnJob();};9.3關(guān)聯(lián)關(guān)系的映射關(guān)聯(lián)關(guān)系是對(duì)象之間的十分重要的一種關(guān)系。關(guān)聯(lián)關(guān)系不僅存在于系統(tǒng)的應(yīng)用域中的實(shí)體類之間,也存在于系統(tǒng)的分析域、設(shè)計(jì)域及實(shí)現(xiàn)域中的各種類型的類之間。關(guān)聯(lián)最重要的含義在于,一個(gè)對(duì)象可以通過關(guān)聯(lián)訪問到與之關(guān)聯(lián)對(duì)象所提供的任何服務(wù)。對(duì)象模型將關(guān)聯(lián)關(guān)系描述成一種類之間的靜態(tài)的結(jié)構(gòu)性的關(guān)系。但實(shí)際上,關(guān)聯(lián)關(guān)系卻是對(duì)象之間存在的動(dòng)態(tài)關(guān)系。雖然大多數(shù)情況下,實(shí)例化一個(gè)關(guān)聯(lián)關(guān)系時(shí),往往是簡單地實(shí)例化幾個(gè)對(duì)象,然后再建立它們之間的聯(lián)系就可以了。但很多情況下,對(duì)象之間的關(guān)聯(lián)卻是選擇性的,還可能需要一個(gè)相對(duì)復(fù)雜的過程來實(shí)例化一個(gè)需要的關(guān)聯(lián)。9.3關(guān)聯(lián)關(guān)系的映射影響關(guān)聯(lián)映射的因素有很多,如關(guān)聯(lián)的方向性、多重性、強(qiáng)制性、有序性、帶有關(guān)聯(lián)類的關(guān)聯(lián)、帶有限定符、聚合關(guān)系和組合關(guān)系等,所有這些因素都會(huì)對(duì)關(guān)聯(lián)的映射產(chǎn)生較大的影響。實(shí)現(xiàn)關(guān)聯(lián)映射最重要的問題是準(zhǔn)確把握這些關(guān)聯(lián)的實(shí)質(zhì)性含義。在C++程序設(shè)計(jì)語言中,實(shí)現(xiàn)關(guān)聯(lián)關(guān)系的基本方法是在關(guān)聯(lián)的起始端的類中嵌入一個(gè)指向被關(guān)聯(lián)對(duì)象的指針,通過這個(gè)指針,這個(gè)對(duì)象可以在其內(nèi)部的任何位置訪問被關(guān)聯(lián)對(duì)象提供的服務(wù)。在映射時(shí),可以將關(guān)聯(lián)端點(diǎn)上的角色名映射為一個(gè)屬性(指向被關(guān)聯(lián)對(duì)象的指針),其可見性一般設(shè)置為private。有時(shí)為了維護(hù)對(duì)象之間的關(guān)聯(lián)關(guān)系,相應(yīng)的C++類中還應(yīng)添加對(duì)指針進(jìn)行讀寫操作的訪問成員函數(shù)。9.3.1關(guān)聯(lián)的方向性從關(guān)聯(lián)的多重性的角度來看,關(guān)聯(lián)可以分成單向關(guān)聯(lián)和相關(guān)聯(lián)兩種情況。如圖9-4就給出了單向關(guān)聯(lián)和雙向關(guān)聯(lián)的例子。單向關(guān)聯(lián)的含義是關(guān)聯(lián)中A類對(duì)象可以通過這個(gè)關(guān)聯(lián)訪問B類對(duì)象。反之,B類對(duì)象卻不能通過這個(gè)關(guān)聯(lián)訪問A類對(duì)象。雙向關(guān)聯(lián)的含義是關(guān)聯(lián)中任何一端的對(duì)象都可以通過關(guān)聯(lián)訪問另一端的對(duì)象。圖9-4單向關(guān)聯(lián)和雙向關(guān)聯(lián)a)單向關(guān)聯(lián)b)雙向關(guān)聯(lián)9.3.1關(guān)聯(lián)的方向性1)單向關(guān)聯(lián)的映射
classA{private:B*m_B;public:A();virtual~A();};classB{public:B();virtual~B();};2)雙向關(guān)聯(lián)的映射
classA{private:B*m_B;public:A();virtual~A();};classB{private:A*m_A;public:B();virtual~B();};這兩種情況的關(guān)聯(lián)映射出來的C++類定義如下9.3.2多重性與關(guān)聯(lián)映射關(guān)聯(lián)角色在類中的具體實(shí)現(xiàn)還依賴于關(guān)聯(lián)的多重性。通常情況下,關(guān)聯(lián)角色的多重性一般可分為0..1、1、0..*和1..*等多種情況,關(guān)聯(lián)的兩個(gè)關(guān)聯(lián)角色含有一個(gè)多重性。這可以使關(guān)聯(lián)組合出多種不同的情況,映射時(shí)需要關(guān)注的是關(guān)聯(lián)對(duì)象之間的關(guān)聯(lián)是否滿足特定的多重性要求。實(shí)現(xiàn)關(guān)聯(lián)多重性即包含了類結(jié)構(gòu)方面的約束,同時(shí)還可能包含了算法方面的約束。圖9-4中給出了若干個(gè)具有不同的多重性的關(guān)聯(lián)的實(shí)例,不同的關(guān)聯(lián)給系統(tǒng)的實(shí)現(xiàn)帶來了不同的約束條件,將它們映射到程序設(shè)計(jì)語言所得到的結(jié)果也會(huì)有重要的差別,有時(shí)甚至?xí)泻艽蟮膮^(qū)別。探究這些差別將有助于更深刻地理解關(guān)聯(lián)的建模意義和編程方面的意義,這些區(qū)別將主要體現(xiàn)在類的關(guān)聯(lián)角色屬性定義、類的方法、關(guān)聯(lián)對(duì)象的實(shí)例化以及這些方法的使用等多個(gè)方面。9.3.2多重性與關(guān)聯(lián)映射圖9-5關(guān)聯(lián)的多重性強(qiáng)制對(duì)可選的一對(duì)一關(guān)聯(lián)b)強(qiáng)制對(duì)強(qiáng)制的一對(duì)一關(guān)聯(lián)c)強(qiáng)制對(duì)可選的一對(duì)多關(guān)聯(lián)d)可選對(duì)可選的一對(duì)多關(guān)聯(lián)9.3.2多重性與關(guān)聯(lián)映射強(qiáng)制對(duì)可選的關(guān)聯(lián)的類定義classA{private:B*m_B;public:A();virtual~A();voidSetB(B*b);B*GetB();};classB{private:A*m_A;public:B(A&a);virtual~B();};強(qiáng)制對(duì)可選的關(guān)聯(lián)的類實(shí)現(xiàn)
#include"A.h"A::A(){}A::~A(){}voidA::SetB(B*b){m_B=b;}B*A::GetB(){returnm_B;}#include"B.h"B::B(A*a){m_A=a;}B::~B(){}9.3.2多重性與關(guān)聯(lián)映射強(qiáng)制對(duì)可選一對(duì)一關(guān)聯(lián)創(chuàng)建和使用圖9-5中a表示的強(qiáng)制對(duì)可選一對(duì)一關(guān)聯(lián)的示例如下:1創(chuàng)建任何一個(gè)B類的實(shí)例時(shí),必須先創(chuàng)建相應(yīng)的類A的實(shí)例,并創(chuàng)建這兩個(gè)對(duì)象的鏈接關(guān)系。創(chuàng)建過程如下:A*a=newA(); //首先,創(chuàng)建A類實(shí)例a。B*b=newB(*a); //創(chuàng)建與a關(guān)聯(lián)的B類實(shí)例ba.SetB(*b); //設(shè)置對(duì)象a到對(duì)象b的關(guān)聯(lián)。9.3.2多重性與關(guān)聯(lián)映射2需要單獨(dú)創(chuàng)建A類實(shí)例時(shí),可不必創(chuàng)建類B的實(shí)例,也不必創(chuàng)建這個(gè)關(guān)聯(lián)的實(shí)例。A類實(shí)例以單獨(dú)的身份履行它所承擔(dān)的系統(tǒng)責(zé)任。創(chuàng)建過程如下:A*a=newA();3撤銷A類對(duì)象時(shí),如果存在與其關(guān)聯(lián)的B類對(duì)象,那么應(yīng)首先撤銷這個(gè)B類對(duì)象,然后再撤銷這個(gè)A類對(duì)象。撤銷過程如下:if(!a->GetB()){deletea->GetB();}deletea;9.3.2多重性與關(guān)聯(lián)映射4撤銷B類對(duì)象時(shí),如果存在與其關(guān)聯(lián)的A類對(duì)象,那么應(yīng)首先在A類對(duì)象中注銷這個(gè)關(guān)聯(lián),然后再撤銷這個(gè)B類對(duì)象。撤銷過程如下:if(!b->GetA()){b->SetA(NULL); //在A類對(duì)象中注銷這個(gè)關(guān)聯(lián)}deleteb; //撤銷B類對(duì)象9.3.2多重性與關(guān)聯(lián)映射2.強(qiáng)制對(duì)強(qiáng)制的一對(duì)一關(guān)聯(lián)而對(duì)于圖9-5中b強(qiáng)制對(duì)強(qiáng)制的一對(duì)一關(guān)聯(lián)來說,它所表達(dá)的含義則是:對(duì)于每一個(gè)類A的對(duì)象a,必須有一個(gè)類B的對(duì)象b和從對(duì)象a到對(duì)象b的鏈接。同時(shí),對(duì)于對(duì)象b來說,也要求存在一個(gè)從對(duì)象b到對(duì)象a的鏈接。其映射代碼如下所示。強(qiáng)制對(duì)可選的關(guān)聯(lián)的類定義
classA{private:B
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 通信行業(yè)保安工作總結(jié)
- 咖啡店銷售員銷售工作總結(jié)
- 礦業(yè)工程師礦產(chǎn)開采管理
- 食品飲料行業(yè)美工工作總結(jié)
- 《熱卷板產(chǎn)品介紹》課件
- 2021年四川省成都市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2021年湖南省益陽市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2021年河南省許昌市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 《婚姻家庭繼承法》課件
- 電視臺(tái)新年新春團(tuán)拜會(huì)及廣告詞選用資料
- 天全縣儲(chǔ)備林建設(shè)項(xiàng)目施工組織設(shè)計(jì)樣本
- 礦權(quán)收儲(chǔ)方案
- 2022-2023學(xué)年重慶市渝北區(qū)人教PEP版五年級(jí)上冊(cè)期末英語試卷
- 安徽省合肥市廬江縣2022-2023學(xué)年八年級(jí)上學(xué)期期末物理試卷(含答案)
- 造價(jià)年度工作總結(jié)
- 護(hù)理人員應(yīng)急預(yù)案培訓(xùn)課件:居家病人護(hù)理與應(yīng)急服務(wù)
- 液壓與氣動(dòng)傳動(dòng)CAI第1章
- 廣告?zhèn)髅叫袠I(yè)操作人員安全培訓(xùn)
- ICU呼吸系統(tǒng)護(hù)理的專業(yè)技巧與注意事項(xiàng)
- 藝術(shù)類院校加強(qiáng)藝術(shù)法教育的思考
- 銀行商會(huì)戰(zhàn)略合作協(xié)議書
評(píng)論
0/150
提交評(píng)論