面向?qū)ο蠓治雠c設(shè)計 課件 第5、6章 類圖建模、順序圖與通信圖建模_第1頁
面向?qū)ο蠓治雠c設(shè)計 課件 第5、6章 類圖建模、順序圖與通信圖建模_第2頁
面向?qū)ο蠓治雠c設(shè)計 課件 第5、6章 類圖建模、順序圖與通信圖建模_第3頁
面向?qū)ο蠓治雠c設(shè)計 課件 第5、6章 類圖建模、順序圖與通信圖建模_第4頁
面向?qū)ο蠓治雠c設(shè)計 課件 第5、6章 類圖建模、順序圖與通信圖建模_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章類圖建模學(xué)習(xí)目標(biāo)

理解和掌握類圖的概念,理解和掌握類圖的構(gòu)成元素及其表示法

理解和掌握從用例圖導(dǎo)出結(jié)構(gòu)模型的一般方法

理解和掌握類圖的基本建模策略和一般建模方法

深刻理解和領(lǐng)會類圖的意義和作用第5章類圖建模面向?qū)ο蠓治鲞^程中,用例建模過程的實質(zhì)也是一個功能分析的過程,其直接結(jié)果是得到了目標(biāo)系統(tǒng)的功能模型。但實際上我們可以得到的不僅僅是一個功能模型,事實上我們還可以如從這些用例以及這些用例的動作序列中找到與這個用例相關(guān)的業(yè)務(wù)邏輯、業(yè)務(wù)實體以及非功能屬性等等,這些都是影響目標(biāo)系統(tǒng)的重要因素。本節(jié)我們將主要討論類圖模型及其建模方法,同時還討論如何從用例模型中找到相應(yīng)的類(或?qū)ο螅瑥亩⒛繕?biāo)系統(tǒng)的類圖模型(也稱為概念模型或結(jié)構(gòu)模型)。值得一提的是,在分析階段建立的類圖模型并不一定就是目標(biāo)系統(tǒng)的最終結(jié)構(gòu)模型,大多數(shù)情況下,分析階段建立的類圖模型僅僅是系統(tǒng)的概念模型,而到系統(tǒng)設(shè)計階段還需要進(jìn)一步細(xì)化為目標(biāo)系統(tǒng)的結(jié)構(gòu)模型。本章將討論類圖模型的表示和建模方法,以及如何從功能模型導(dǎo)出概念模型。5.1類圖的構(gòu)成元素類圖模型的主要構(gòu)成元素不外乎類和類之間的關(guān)系兩大部分。其具體的構(gòu)成元素包括:類、對象、繼承、關(guān)聯(lián)、聚合、組合和依賴等元素,還包括類型、接口、信號等模型元素。類圖模型的主要用途在于描述系統(tǒng)的靜態(tài)結(jié)構(gòu),它是軟件模型中最重要的結(jié)構(gòu)模型。本小節(jié)將詳細(xì)介紹類圖的主要構(gòu)成元素和相關(guān)的基本概念。5.1.1類和對象類(class)被定義為具有相同屬性和行為的全體對象構(gòu)成的集合,實際上也代表了對對象的一種分類,分類的依據(jù)則是這些對象所具有的屬性和方法。類所描述的并不是某個特定實體的特定行為,而僅用于描述同一類對象(一類對象)所具有的共同特征。UML中,使用帶有類名、屬性和操作的矩形框表示類。其中,類名是類的名字,在同一個上下文中,類名不允許重復(fù)。屬性和操作分別表示類所擁有的屬性和操作的集合。5.1.1類和對象UML類屬性和方法的一般格式如下:[作用域][可見性]屬性名[:數(shù)據(jù)類型[=缺省值]][作用域][可見性]方法名([[in/out]參數(shù)名[:數(shù)據(jù)類型],…]):參數(shù)列表中,關(guān)鍵字in表示輸入?yún)?shù),out表示輸出參數(shù)。5.1.1類和對象例如,圖5-1給出了一個類的圖形表示實例,圖中Employee是類名,Name、EmployeeID和Title是屬性。GetPhoto(p:Photo)、GetPersonRecord()和GetContactInfomation()則是這個類的方法。圖5-1類的圖形表示5.1.1類和對象程序設(shè)計語言中,通常稱不能實例化的類為抽象類,而稱可以實例化的類為具體類。UML支持抽象類和具體類的描述,UML默認(rèn)的類是具體類,其外觀是類名用正常體表示。而抽象類的外觀則是類名使用斜體的形式表示。如圖5-1中的類就表示了一個抽象類。與類相關(guān)一個問題是屬性和方法的可見性問題。UML中,類屬性和方法的可見性被定義分為公共、私有和保護(hù)三個級別。在UML類的圖形表示中,使用+、-和#分別表示公共、私有和保護(hù)這三種可見性。缺省的可見性是公共可見性。5.1.1類和對象如圖5-1中,Name、EmployeeID和Title等三個屬性的可見性均是私有可見性。GetPhoto()和GetContactInfo()方法的可見性則是公共的。5.1.1類和對象面向?qū)ο蟪绦蛘Z言中,屬性和方法的作用域被分為類作用域和實例作用域兩種情況。類作用域是指類中不依賴類的實例而存在的屬性和方法。無論是否創(chuàng)建類的實例,類中具有類作用域的屬性和方法就已經(jīng)存在并可以訪問。而當(dāng)創(chuàng)建了一個或多個類的實例時,類類作用域的屬性和方法也沒有因為這些實例的創(chuàng)建而建立多個不同的副本。與類作用域相反,實例作用域則是指類中其存在性和訪問性均依賴于實例的屬性和方法。UML類中,使用正常體和斜體的屬性或方法名來表示具有作用域,斜體表示類作用域,正常體則表示實例作用域。UML默認(rèn)的作用域是實例作用域。5.1.1類和對象與類屬性和方法相關(guān)的最后一個問題是數(shù)據(jù)類型問題,UML以標(biāo)準(zhǔn)UML數(shù)據(jù)類型、程序設(shè)計語言的數(shù)據(jù)類型和自定義數(shù)據(jù)類型等三種方式支持?jǐn)?shù)據(jù)類型。UML類中,屬性、方法以及方法的形式參數(shù)和返回值等均可以使用這些數(shù)據(jù)類型。如圖5-1中,屬性EmployeeID的數(shù)據(jù)類型int就是一個標(biāo)準(zhǔn)的數(shù)據(jù)類型。而方法GetPhoto()的返回值類型(Photo)則可以看作是一個類或自定義的數(shù)據(jù)類型。5.1.2類(或?qū)ο螅┲g的關(guān)系嚴(yán)格地說,在面向?qū)ο笙到y(tǒng)中,類之間的關(guān)系主要是指類之間的泛化關(guān)系。而對象之間的關(guān)系卻可以是多樣的,面向?qū)ο蠓椒▽⑺鼈兂橄蟪梢蕾?、關(guān)聯(lián)、聚合、組合等四種關(guān)系。雖然這些關(guān)系描述的是對象之間的關(guān)系,但UML卻統(tǒng)一地使用類圖來描述這些關(guān)系,并為它們定義了相應(yīng)的表示法。因此,類圖模型中的關(guān)系就被概括成依賴、關(guān)聯(lián)、聚合、組合和泛化這五種關(guān)系。值得注意的是,在概念上嚴(yán)格地區(qū)分類關(guān)系與對象關(guān)系之間的聯(lián)系和區(qū)別,將是從事面向?qū)ο蠓治雠c設(shè)計工作的極為重要的基本思維方式和工作基礎(chǔ)。5.1.2類(或?qū)ο螅┲g的關(guān)系1.依賴關(guān)系(Dependency)對于兩個對象來說,如果一個對象(或類)的屬性或行為發(fā)生的某種變化將會引起另一個對象(或類)的屬性或行為發(fā)生必要的改變,那么就稱這兩個對象(或類)之間存在某種依賴關(guān)系。UML使用類圖描述對象之間的依賴關(guān)系,這種方式可以更容易地描述目標(biāo)系統(tǒng)中對象(或類)之間存在的依賴關(guān)系。對象之間的依賴關(guān)系的實質(zhì)是指系統(tǒng)中存在的某種耦合關(guān)系。UML使用一個帶有箭頭的虛線表示類之間的依賴關(guān)系。5.1.2類(或?qū)ο螅┲g的關(guān)系

圖5-2對象之間的依賴關(guān)系圖5-2給出了對象間的依賴關(guān)系的類圖表示。對于類來說,依賴的確切含義是A類的某個實例訪問了某個(或某些)B類實例的某些屬性或方法,當(dāng)B類的屬性或方法發(fā)生改變時,將會引起A類發(fā)生相應(yīng)的改變。5.1.2類(或?qū)ο螅┲g的關(guān)系2.關(guān)聯(lián)關(guān)系(Association)關(guān)聯(lián)(Association)關(guān)系是對象(或類)之間存在的結(jié)構(gòu)性的關(guān)系,其確切的定義是:對于兩個對象(或類)來說,如果在一個對象的內(nèi)部可以訪問另一個對象的所有屬性和方法時,我們就可以稱這兩個對象(或類)之間存在著關(guān)聯(lián)關(guān)系。如汽車和輪胎、師傅和徒弟、班級和學(xué)生之間的關(guān)系等。顯然,關(guān)聯(lián)關(guān)系必然是一種依賴關(guān)系。在UML中,使用一條實線連接有關(guān)聯(lián)關(guān)系的對象所屬的類來表示對象之間的關(guān)聯(lián)關(guān)系。而在程序設(shè)計語言中,通常采用將一個類的實例或?qū)嵗米鳛榱硪粋€類的成員的方式來實現(xiàn)對象之間的關(guān)聯(lián)關(guān)系。5.1.2類(或?qū)ο螅┲g的關(guān)系圖5-3關(guān)聯(lián)的UML表示關(guān)聯(lián)可以是有方向的,也可以是無方向的。因此,關(guān)聯(lián)可以分成單向關(guān)聯(lián)和雙向關(guān)聯(lián)。圖5-3給出了類關(guān)聯(lián)的UML表示。其中,(a)給出了雙向關(guān)聯(lián),(b)給出了單向關(guān)聯(lián)的UML表示。雙向關(guān)聯(lián)的含義是相互關(guān)聯(lián)的兩個對象之間是可以互相訪問的,即任何兩個相互關(guān)聯(lián)的對象之間可以互相訪問;單向關(guān)聯(lián)的含義則是相互關(guān)聯(lián)的兩個對象之間的訪問則是單向的,如5.3(b)中的A類對象可以訪問與之關(guān)聯(lián)的B類對象,反之則不可以。5.1.2類(或?qū)ο螅┲g的關(guān)系2.關(guān)聯(lián)關(guān)系(Association)關(guān)聯(lián)(Association)關(guān)系是對象(或類)之間存在的結(jié)構(gòu)性的關(guān)系,其確切的定義是:對于兩個對象(或類)來說,如果在一個對象的內(nèi)部可以訪問另一個對象的所有屬性和方法時,我們就可以稱這兩個對象(或類)之間存在著關(guān)聯(lián)關(guān)系。如汽車和輪胎、師傅和徒弟、班級和學(xué)生之間的關(guān)系等。顯然,關(guān)聯(lián)關(guān)系必然是一種依賴關(guān)系。在UML中,使用一條實線連接有關(guān)聯(lián)關(guān)系的對象所屬的類來表示對象之間的關(guān)聯(lián)關(guān)系。而在程序設(shè)計語言中,通常采用將一個類的實例或?qū)嵗米鳛榱硪粋€類的成員的方式來實現(xiàn)對象之間的關(guān)聯(lián)關(guān)系。5.1.2類(或?qū)ο螅┲g的關(guān)系關(guān)聯(lián)角色(Associationrole)可以看成是對參與關(guān)聯(lián)的對象(或?qū)嶓w)在關(guān)聯(lián)中所充當(dāng)?shù)慕巧?。一般情況下,每個關(guān)聯(lián)都應(yīng)該含有若干個關(guān)聯(lián)角色。描述關(guān)聯(lián)關(guān)系時,通常需要為關(guān)聯(lián)命名和關(guān)聯(lián)角色命名。關(guān)聯(lián)名字用于標(biāo)識實體間的某種特定聯(lián)系。關(guān)聯(lián)角色名則表示關(guān)聯(lián)對象在與其關(guān)聯(lián)的對象中所承擔(dān)的職責(zé)。一個關(guān)聯(lián)關(guān)系通常包含兩個關(guān)聯(lián)角色,角色名可以使類(對象)之間的關(guān)系更加明確。5.1.2類(或?qū)ο螅┲g的關(guān)系關(guān)聯(lián)角色的多重性表示這種關(guān)聯(lián)角色在與之關(guān)聯(lián)的對象中存在的數(shù)量關(guān)系。同一個關(guān)聯(lián)的兩個關(guān)聯(lián)角色可以有不同的多重性。多重性一般可用一個數(shù)值、一個變量或一個范圍值來加以表示。其中,*表示多的,其可取值不固定。常見的多重性表示包括:0、1、*、0..1、0..*和1..*等多種形式。將關(guān)聯(lián)角色映射到實現(xiàn)域時,關(guān)聯(lián)角色(包括關(guān)聯(lián)角色名及其多重性)將被映射成對應(yīng)的類或?qū)ο蟮囊粋€屬性。5.1.2類(或?qū)ο螅┲g的關(guān)系例如,圖5-4中的關(guān)聯(lián)。其中,關(guān)聯(lián)的名字為employ,表示兩個對象之間的聘用關(guān)系。關(guān)聯(lián)兩端的關(guān)聯(lián)角色名分別為cop和staff,其中cop表示Corporation對象在Staffmember對象中所充當(dāng)?shù)慕巧M瑯?,staff表示Staffmember對象在Corporation對象中所充當(dāng)?shù)慕巧?。圖5-4關(guān)聯(lián)的角色名和多重性5.1.2類(或?qū)ο螅┲g的關(guān)系閱讀下列程序代碼,會更容易地理解圖5-4中各個模型元素或符號的意義。publicclassCorporation{privatestringID;privatestringName;publicStaffmemberstaff[];publicCorporation(){}publicCorporation(stringid,stringname){ID=id;Name=name;}publicAddStaffmember(Staffmemberm){staff.Add(m);}}publicclassStaffmember{privatestringID;privatestringName;publicCorporationcop;publicStaffmember(){}publicStaffmember(stringid,stringname,Corporationc){ID=id;Name=name;Cop=c;}}5.1.2類(或?qū)ο螅┲g的關(guān)系最后一個問題是關(guān)聯(lián)關(guān)系的實例化問題,實例化具有關(guān)聯(lián)關(guān)系時,不僅要實例化相關(guān)對象,還需要建立起關(guān)聯(lián)對象之間的鏈接。假設(shè)系統(tǒng)中的Corporation對象為Corporation(001,“陽光股份”),其員工包括:張三、“李四”和“王二”等三個員工。此時,這組對象及其關(guān)聯(lián)關(guān)系的實例化過程可以描述如下。Corporationc=newCorporation(001,“陽光股份”);//實例化Corporation對象;Staffmembers1=newStaffmember(“01”,“張三”,c);//實例化Staffmember對象;Staffmembers2=newStaffmember(“02”,“李四”,c);Staffmembers3=newStaffmember(“03”,“王二”,c);c.AddStaffmember(s1);c.AddStaffmember(s2);c.AddStaffmember(s3);5.1.2類(或?qū)ο螅┲g的關(guān)系圖5-5中的對象圖給出了上述過程實例化出來的關(guān)聯(lián)對象實例。

圖5-5圖5-4中關(guān)聯(lián)的一個實例3.聚合與組合在關(guān)聯(lián)關(guān)系中,聚合(Aggregation)關(guān)系描述的則是對象之間具有的一種整體和部分之間的關(guān)系。如果一個對象是另一個對象的一個組成部分,那么稱兩個對象之間的關(guān)系是一種聚合關(guān)系。特別地,當(dāng)這兩個對象具有相同的生命周期時,又稱這個聚合關(guān)系為組合(Composition)關(guān)系。聚合關(guān)系可以用一個帶有空心菱形框的直線表示,菱形框一端是整體對象,有時也稱其為聚合,另一端是部分對象。當(dāng)聚合關(guān)系也是一個組合關(guān)系時,這個表示中的菱形框就換成實心的菱形框表示。3.聚合與組合圖5-6給出了表示了聚合和組合關(guān)系的UML類圖表示。圖5-6聚合和組合關(guān)系的類圖表示需要特別指出的是,聚合關(guān)系是一種特殊的關(guān)聯(lián)關(guān)系,關(guān)聯(lián)關(guān)系的一切特性都適用于聚合關(guān)系。與一般的關(guān)聯(lián)關(guān)系不同的是,聚合關(guān)系中,部分對象是整體對象的一個組成部分,它(或它們)承擔(dān)了整體對象所承擔(dān)的某個(或某些)系統(tǒng)責(zé)任,是整體對象所固有不可分割的一個組成部分。組合關(guān)系則強(qiáng)調(diào)了部分對象與整體對象之間聯(lián)系的強(qiáng)度,強(qiáng)調(diào)了部分對象與整體對象在生存期方面的緊密聯(lián)系。建模時,將關(guān)聯(lián)關(guān)系建模成組合或聚合需要關(guān)注的是兩個對象的系統(tǒng)責(zé)任與生存期之間的關(guān)系。3.聚合與組合在關(guān)聯(lián)關(guān)系中,聚合(Aggregation)關(guān)系描述的則是對象之間具有的一種整體和部分之間的關(guān)系。如果一個對象是另一個對象的一個組成部分,那么稱兩個對象之間的關(guān)系是一種聚合關(guān)系。特別地,當(dāng)這兩個對象具有相同的生命周期時,又稱這個聚合關(guān)系為組合(Composition)關(guān)系。聚合關(guān)系可以用一個帶有空心菱形框的直線表示,菱形框一端是整體對象,有時也稱其為聚合,另一端是部分對象。當(dāng)聚合關(guān)系也是一個組合關(guān)系時,這個表示中的菱形框就換成實心的菱形框表示。3.聚合與組合例如,圖5-6中,產(chǎn)品和零件之間就是一種整體與部分之間的關(guān)聯(lián)關(guān)系,每個產(chǎn)品所具有的各項功能通常是由其各個零件及其相互協(xié)作承擔(dān)的,二者是密不可分的。從生存期的角度來看,零件損壞時,只要跟換一個同類型的零件后,產(chǎn)品仍然可以繼續(xù)使用。此時,產(chǎn)品和零件并不具備相同的生存期。因此,我們使用聚合關(guān)系描述二者之間的關(guān)系。而圓和圓心則不同,它們之間除了具有整體和部分之間的關(guān)系之外。二者的生存期也是完全相同的。圓和圓心分離的結(jié)果必然是“圓不是圓,心也不再是圓心”。故我們將其建模成組合關(guān)系。很多情況下,將對象之間的關(guān)系建模成聚合或組合關(guān)系本身并不是客觀的,如何建模通常取決于設(shè)計者的主觀決策,沒有必要過分地糾結(jié)聚合或組合的選擇。4.泛化與特化泛化關(guān)系是一種純粹的類之間的關(guān)系。如果一個類擁有了另一個類的所有屬性和方法,則稱這兩個類之間具有泛化關(guān)系,同其它模型元素之間的泛化關(guān)系的表示方法一樣,UML也使用帶有空心箭頭的直線表示類之間的泛化關(guān)系。圖5-7繼承關(guān)系的類圖表示4.泛化與特化當(dāng)多個泛化關(guān)系出現(xiàn)在同一個上下文中時,就可能構(gòu)成一個多層的層次結(jié)構(gòu)。在這個結(jié)構(gòu)中,稱比較高層(抽象)的類為超類,比較低層(具體)的類為子類。這意味著超類通常是一種代表了一組類的公共特征的通用類,子類往往是其超類的在某個繼承層次上的一個特例。我們把從子類出發(fā)設(shè)計或創(chuàng)建超類的過程稱為泛化(Specialization),反之把由超類開始設(shè)計或創(chuàng)建子類的過程稱為特化(Generalization)。因此,雖然泛化和特化在本質(zhì)上沒有太大的差別。不同的是,它們代表了不同的構(gòu)建類層次結(jié)構(gòu)的過程,這意味著,它們建模的目標(biāo)、出發(fā)點(diǎn)和建模順序均有所不同。實際的軟件建模過程中,兩種過程往往是混雜在一起進(jìn)行的,一個良好的層次結(jié)構(gòu)通常要經(jīng)過一個復(fù)雜的設(shè)計過程才能獲得。泛化關(guān)系是一種純粹的類之間的關(guān)系,它并不指明這些類的實例之間存在什么樣的鏈接關(guān)系。第6章順序圖與通訊圖建模學(xué)習(xí)目標(biāo)理解和掌握順序圖和通訊圖概念、構(gòu)成元素和表示法理解和掌握順序圖與通訊圖二者之間的聯(lián)系和區(qū)別理解和掌握順序圖和通訊圖的建模策略和建模方法深刻理解和掌握順序圖和通訊圖建模的意義和作用第6章順序圖與通訊圖建模任何一個軟件系統(tǒng)均包括靜態(tài)結(jié)構(gòu)和動態(tài)行為兩個方面,使用類圖可以建模系統(tǒng)的靜態(tài)行為。而使用順序圖、通訊圖、狀態(tài)圖和活動圖等四種模型者可以建模系統(tǒng)的動態(tài)行為。UML的基本目標(biāo)不僅僅在于捕獲結(jié)構(gòu)方面的關(guān)系,而更傾向于捕獲過程和事件流。UML交互圖幾乎借鑒了統(tǒng)一建模語言中的所有其它捕捉對象之間通信表示的圖,同時也極大地擴(kuò)展了的描述復(fù)雜控制流的能力。第6章順序圖與通訊圖建模UML將順序圖和通訊圖統(tǒng)稱為交互圖,UML定義交互圖來強(qiáng)調(diào)對象之間的鏈接和消息通信,而不是與該通信相關(guān)聯(lián)的數(shù)據(jù)操縱。交互圖關(guān)注的是對象之間傳遞的特定消息,以及如何將這些消息聚集在一起以實現(xiàn)特定的功能。交互圖可以準(zhǔn)確地描繪出哪些對象組成的復(fù)合結(jié)構(gòu)可以滿足并實現(xiàn)特定的需求。順序圖和通訊圖之間存在語義等價的關(guān)系,但它們不僅在形式上不盡相同,它們在內(nèi)容和表達(dá)的語義方面也不盡相同。二者一方面是兩種語義等價的兩種模型,同時它們也都屬于狀態(tài)機(jī)模型。而另一方面,二者描述問題的角度和方法也不盡相同,其用途和建模方法也不盡相同。本章將詳細(xì)介紹順序圖和通訊圖的構(gòu)成元素、用途和建模方法。6.1順序圖的構(gòu)成元素順序圖是一種由對象和對象之間的消息構(gòu)成的圖,其最主要的特點(diǎn)是其消息傳遞的時間順序。是對系統(tǒng)中的若干個對象按照時間順序所進(jìn)行的交互所表現(xiàn)出來的行為的一種結(jié)構(gòu)化表示。順序圖的主要作用在于描述系統(tǒng)為實現(xiàn)某個目的而進(jìn)行的一個過程、完成這個過程所需要的參與者、以及為實現(xiàn)這個過程所需要的這些對象之間的消息傳遞(合作)。在面向?qū)ο蠓椒ㄖ?,順序圖可用于面向?qū)ο蠓治?、面向?qū)ο笤O(shè)計和面向?qū)ο蟪绦蛟O(shè)計等各個階段。在面向?qū)ο蠓治鲭A段,順序圖可用于描述用例過程,并有助于捕獲系統(tǒng)中的信息流和系統(tǒng)責(zé)任。早期分析中獲得的對象將被轉(zhuǎn)換成系統(tǒng)角色,對象之間的消息最終被轉(zhuǎn)換成為系統(tǒng)類模型中某個類的操作。而在面向?qū)ο笤O(shè)計階段,順序圖可用于描述某個用例場景或某個類方法,獲得的對象將被映射為系統(tǒng)中的對象(類),消息也將被映射為目標(biāo)系統(tǒng)中的某個(或某些)類方法。順序圖的構(gòu)成元素包括:生命線(lifeline)、控制焦點(diǎn)(controlfocus)、消息(message)、分支(decision)、撤銷(destroy)、組合片段(combinefragement)等。下面將詳細(xì)介紹這些模型元素的概念和表示方法。6.1.1對象(Object)對象是順序圖的主要構(gòu)成元素,它表示參與順序圖所表示的過程的主體參與者。其表示與對象圖中的表示基本相同。順序圖中可以出現(xiàn)各種對象,這些對象通常包括參與者、邊界類、控制類、實體類和普通類等類型的對象。圖6-1列出了順序圖中常見的對象。而圖6-2則給出了一個包含了各種對象的順序圖的實例。圖6-2順序圖的應(yīng)用實例6.1.1對象(Object)圖6-1順序圖中常見的對象6.1.2生命線(lifeline)生命線是從對象圖標(biāo)向下出來的延伸的一條直線,也是和對象緊密聯(lián)系在一起的一種模型元素,用于表示對象的生存期或生存期內(nèi)的某個時間片段。事實上,在順序圖中,對象和生命線是不可分割的同一個元素,生命線是對象的一個組成部分,代表了對象的整個或部分生命期。順序圖中即不存在沒有生命線的對象,也不存在沒有對象的生命線。當(dāng)然這并不排除生命線分支的概念。6.1.3控制焦點(diǎn)(Focusofcontrol)如果某個對象在某個時刻或時間片段內(nèi),它處于其某個操作被正在被執(zhí)行的狀態(tài),那么我們稱這個對象處于激活(Active)狀態(tài)。否則,處于非激活(Deactive)狀態(tài)。所以,當(dāng)多個對象參與同一個活動時,并不是每個對象都處于激活狀態(tài)。即使這些對象之間的活動是并發(fā)的,也不太可能每個對象都處于激活狀態(tài)??刂平裹c(diǎn)也稱為激活期(Activation),指生命線上的那些小矩形,它們表示對象處于的激活狀態(tài)的時間片段。當(dāng)不同生命線上的控制焦點(diǎn)發(fā)生時間片段的重疊時,這可能會引出控制焦點(diǎn)之間的嵌套。圖6-3中的順序圖就包含了多個控制焦點(diǎn)之間的嵌套關(guān)系。6.1.3控制焦點(diǎn)(Focusofcontrol)圖6-3中的順序圖就包含了多個控制焦點(diǎn)之間的嵌套關(guān)系。圖6-2順序圖的應(yīng)用實例6.1.4消息(Message)消息是順序圖中最重要的概念,用于表示圖中對象之間的通信,即一個對象向另一個對象發(fā)送的消息。在順序圖中,消息被表示成攜帶了某種信息的控制流。按照消息的傳遞方式,可以將消息分為同步消息(synchronous)和異步消息(asynchronous)兩大類。同步消息是指以同步方式發(fā)送的消息,通常指對象方法的調(diào)用。發(fā)送同步消息時,發(fā)送者需要與接收者對接收到的消息處理同步,即等待接收者處理完接收到的消息并返回一個確切的消息之后,才能夠進(jìn)行其后續(xù)的動作。所以,同步消息必須有一個對應(yīng)的返回消息,不過,返回消息可以不必顯式地出現(xiàn)在順序圖中。對于同步消息來說,還需要存在一個與之對應(yīng)的返回消息(return)。異步消息(asynchronous)是指對象以異步方式發(fā)送的消息。發(fā)送異步消息時,發(fā)送者既不等待接收者處理完這條消息也不等待接收者的返回消息,而是繼續(xù)執(zhí)行其后續(xù)的處理。6.1.4消息(Message)與異步消息相伴的是信號,信號可以看成是一組參數(shù)或?qū)傩詷?gòu)成的集合。也可以看成是以異步方式傳遞的消息的內(nèi)容。不同的UML建模軟件定義了不同的消息類型的。表6-1給出了Rationalrose建模系統(tǒng)中定義的各種消息,可以看出這些消息并不是對消息概念的嚴(yán)格劃分,實際上是消息的不同屬性的一種描述。這些不同的消息,適用于不同的建模場景。除了圖形符號,UML還使用消息表達(dá)式的方式來描述消息。按照對象間交互的形式,可以把消息分成方法調(diào)用、發(fā)送信號、創(chuàng)建實例和銷毀對象等多種形式。其中,最常用的形式就是對象間的方法調(diào)用。6.1.4消息(Message)描述方法調(diào)用或發(fā)送信號的消息的語法格式定義如下:[returnvalue=]message_name(arguments):type_of_return_valuereturn_value:是消息的可選部分,表示存儲消息返回值的變量。這個變量可以是發(fā)送者的一個屬性、整個交互的全局屬性、或者是某個擁有交互的類的屬性。message_name:表示消息名稱,可以是接收者的某個方法名或發(fā)送的信號名等。arguments:表示消息參數(shù)列表,是一個用逗號分隔的若干個參數(shù)構(gòu)成的列表,其中每個參數(shù)都可以是參數(shù)名或參數(shù)值。type_of_return_value:返回值類型。6.1.4消息(Message)消息類型主要特征符號表示簡單消息(Simple)泛指的,不需要詳細(xì)說明其類型的消息過程調(diào)用(procedurecall)與對象的操作對應(yīng)的消息同步消息(synchronous)以同步方式發(fā)送的消息異步消息(asynchronous)以異步方式發(fā)送的消息返回消息(return)接收者收到某個消息后,向發(fā)送者返回的消息阻止消息(Balking)指接收者不能立即接收,則發(fā)送者就要放棄的消息超時消息(Timeout)接收者不能在指定的時間內(nèi)接收,發(fā)送者就要放棄的消息自調(diào)用消息(Self)一個對象給自身發(fā)送的消息6.1.5條件分支和從屬流順序圖中也允許使用分支,這包括條件分支和從屬流兩種分支。條件分支是指一個對象發(fā)送消息的守衛(wèi)條件。從屬流是指從某個對象的生命線上分離出來的一個或多個生命線,用來表示該對象在某個時間片段中所進(jìn)行的并發(fā)活動。圖6-4a和圖6-4b分別給出了包含條件分支和從屬流的順序圖。圖6-4a中的A類對象生命線上就添加了一條從屬流(生命線),這描述了A類對象發(fā)出的兩個消息op1和op2的動作是并發(fā)的兩個活動。而圖6-4b中的兩個消息則表示了這兩個消息發(fā)送條件。然而,并不是每個建模軟件的順序圖都支持從屬流這樣的模型元素。必要時,可以繪制兩張不同的順序圖來描述不同的分支。6.1.5條件分支和從屬流圖6-4包含條件分支和從屬流的順序圖a)從屬流b)條件分支6.1.6撤銷(Destroy)最后再介紹一個順序圖元素,撤銷(Destroy)表示在過程中銷毀某個對象,也表示這個對象生命期的終止。這個元素通常僅用于順序圖中的某個臨時對象。這個對象一般是在順序圖所描述的活動中動態(tài)創(chuàng)建起來的,并在其完成了其職責(zé)后被撤銷。圖6-5給出了一個描述了遺傳算法的順序圖,圖中給出了使用了撤銷這一模型元素的例子。6.1.6撤銷(Destroy)圖6-5包含了撤銷元素的順序圖6.1.6撤銷(Destroy)圖中包含了種群(population)、染色體(chromosome)、基因(Gene)和客戶(Client)等四個類的實例。整個順序圖則描述了遺傳算法在執(zhí)行過程中,所有這些對象之間的交互情況。容易看出,圖中的所有對象的水平位置并不都是相同的,不同的位置表示了這些對象加入到順序圖所描述的過程的時間的不同??蛻?Client)和種群(population)是整個過程的全程參與者,其生命周期最長,它們?nèi)虆⑴c了算法的整個過程。染色體(chromosome)對象和基因(Gene)對象則是由種群(population)對象創(chuàng)建的,它們都是在活動開始以后創(chuàng)建的,并在活動結(jié)束前就已經(jīng)被撤銷了。圖中的創(chuàng)建消息和撤銷元素就描述了這樣的語義。另外,也容易看出,順序圖中的對象創(chuàng)建和對象撤銷應(yīng)該是成對出現(xiàn)的。這一點(diǎn),在不同的建模工具中的實現(xiàn)也是不盡相同的。例如,在EnterpriseArchitect中,就嚴(yán)格要求創(chuàng)建和撤銷這兩個元素成對出現(xiàn),這可以有效地保證模型的合理性。而RationalRose則沒有這樣的約束,但這也給了建模人員極大的自由度。6.1.7組合片段(CombinedFragments)為表示順序圖中對象間的交互片段之間的順序、選擇、循環(huán)等各種關(guān)系方面的約束,UML還定義了組合片段(CombinedFragments)這一模型元素,組合片段的具體定義如下。組合片段可以是一個簡單的矩形區(qū)域,也可以是一個由多個片段組合而成的片段集合。有時,集合中的每個片段也可以是一個組合片段。圖中的每個交互只能屬于一個特定的片段,既不允許片段之間的交叉。圖6-6使用了組合片段的順序圖6.1.7組合片段(CombinedFragments)事實上,順序圖中的組合片段則可以看成一個由多個交互構(gòu)成的矩形區(qū)域,每個區(qū)域還可以依據(jù)某種原則分隔成若干個更小的矩形區(qū)域,這樣,就可以得到整個組合區(qū)域的一個劃分,此時,可以將每個小矩形區(qū)稱為一個片段(fragement)。此時,組合片段顯然就可以看成是一個由多個片段構(gòu)成的集合。再考慮劃分組合片段的原則,就可以得到組合片段的完整定義了。在順序圖中使用組合片段,可以清晰地描述順序圖中各對象之間的交互在某一方面或多個方面應(yīng)具有的特性。圖6-6所示的順序圖描述了顧客和收納員等多個對象參與的結(jié)算過程,圖中使用了“l(fā)oop”和“alt”兩種類型的組合片段的順序圖。其中,第一個組合片段是一個loop類型的組合片段,其內(nèi)部僅包含了一個片段,其循環(huán)條件是”whileitemremaines”。第二個組合片段是一個alt類型的組合片段,其中包含了兩個片段,其中第一個片段的條件是“cash”,表示現(xiàn)金支付方式。第二個片段的條件是“creditcard”,表示“信用卡支付”。這兩個片段,顯然是按條件選擇的兩個片段。對應(yīng)了if<condition>then<fragement1>else<fragement1>這樣的邏輯。容易理解圖中片段的邏輯含義。6.1.7組合片段(CombinedFragments)UML定義了多種不同類型的組合片段,每種組合片段均表達(dá)了不同的含義。表6-2給出了EnterpriseArchitect建模工具軟件中定義的組合片段類型。表6-2組合區(qū)域的分類序號名稱關(guān)鍵字作用1分支區(qū)域alt區(qū)域內(nèi)各個片段按交互算子的邏輯值劃分交互片段2可選區(qū)域opt封裝可選的交互片段3并發(fā)區(qū)域par區(qū)域內(nèi)各片段的操作是并發(fā)操作4循環(huán)區(qū)域loop區(qū)域內(nèi)各片段的操作是重復(fù)執(zhí)行的5臨界區(qū)域critical區(qū)域內(nèi)各片段均是臨界區(qū)域6無效區(qū)域neg斷言一個片段是無效片段7有效區(qū)域assert標(biāo)明有效片段,通常封裝在consider或ignore算子中8強(qiáng)順序區(qū)域strict標(biāo)明片段內(nèi)的交互必須按照嚴(yán)格的順序進(jìn)行9弱順序區(qū)域seq標(biāo)明此組合片段內(nèi)部各片段之間是弱順序的10可忽略區(qū)域ignore表示在執(zhí)行期間可以忽略片段中的消息11可跟蹤區(qū)域consider標(biāo)明片段中消息的跟蹤。和assert一起使用12引用區(qū)域ref封裝對其它圖的引用6.1.7組合片段(CombinedFragments)表中的12種不同類型的片段,對應(yīng)12種不同的消息組合方式,明確地表達(dá)了順序圖中各個交互之間的關(guān)系,為順序圖中的各個交互提供了精確和細(xì)致描述方法。需要說明的是,并不是每個建模軟件都支持組合片段模型元素,而且即使某些軟件支持了這種建模元素的建模,但這種表達(dá)仍然是面向建模人員的。這也是選擇建模工具時需要考慮的一個重要因素。6.2順序圖建模方法順序圖的主要作用在于建模一個過程,這個過程可以是一個用例、場景或類的某個方法。所以順序圖建??梢杂糜谲浖_發(fā)過程的需求分析、設(shè)計和系統(tǒng)實現(xiàn)各個階段。無論使用順序圖用于描述什么或?qū)㈨樞驁D用于軟件開發(fā)的哪個階段,順序圖的主要作用均主要體現(xiàn)在找出新的職責(zé)、對象(類)和方法和軟件開發(fā)人員之間的交流兩個方面。6.2順序圖建模方法1.找出新的職責(zé)、對象(類)和方法。順序圖中最主要的兩種元素就是對象(或類)以及它們之間的消息。順序圖建模時,每向圖中添加了一個新的對象(或類),就意味著有可能找到了新的對象、類或角色。每添加一條消息,就意味著可能為對應(yīng)的對象(或類)添加了一個新的方法。事實上,順序圖建模不僅可以用于描述了系統(tǒng)的動態(tài)行為,同時也會給系統(tǒng)找到了新的對象、類或角色,同時也可能找到了新的方法。6.2順序圖建模方法2.軟件開發(fā)人員之間的交流。順序圖直觀地表示了目標(biāo)系統(tǒng)的動態(tài)行為,這使得它更適合作為軟件開發(fā)人員之間的交流的媒介,尤其是設(shè)計員與程序員之間的交流。并且這種方式的表達(dá)更易于閱讀、理解、交流、評價和改進(jìn)。順序圖的建模過程中,可按照如下基本步驟進(jìn)行。1.明確順序圖的建模目標(biāo)和范圍順序圖的建模目標(biāo)包括描述用例、描述一個或多個場景或建模一個方法。建模范圍自然就可以是一個用例、場景,也可以是某個類的一個方法。建模目的和建模范圍的不同,決定了建模的方法和粒度的不同。越高層次的過程,其粒度往往就粗略一些,涉及到的細(xì)節(jié)就少一些,層次越低的過程,其粒度就越會更細(xì)致一些。因此,建模順序圖時,首先應(yīng)明確建模的目的和范圍是什么。在需求階段使用順序圖建模時,建模的目的就可能是描述需求。此時,順序圖中的對象就可能僅來自于問題域,而設(shè)計域和實現(xiàn)域中所需要的類或方法方面的具體細(xì)節(jié)就可以被忽略。而在設(shè)計階段使用的順序圖,就可能需要包括大多數(shù)甚至全部對象(或類)和它們之間傳遞的消息,同時也應(yīng)該盡可能給出這些類和消息的具體細(xì)節(jié)。6.2順序圖建模方法2.定義順序圖中可以出現(xiàn)的對象(或類)為順序圖找出能夠?qū)崿F(xiàn)建模目標(biāo)所需要的全部對象(或類),這些對象(或類)可以是已知的對象(或類),也可以是新添加的對象(或類)。建模順序圖時,為對象指定明確的類是一個值得關(guān)注的重要問題。對未明確分類的對象進(jìn)行建模,并不能為建模工作帶來實質(zhì)性的模型增量。對出現(xiàn)在順序圖中的每一個對象,還應(yīng)該明確其生命期。即指明對象是臨時對象還是一個全程參與的對象。全程對象的存在性及其狀態(tài)構(gòu)成了順序圖的前置條件。對于臨時對象,這要標(biāo)明這些對象的創(chuàng)建者、創(chuàng)建消息以及撤銷符號。順序圖中,對象可以按任意順序從左向右順序排列,但排列時應(yīng)注意排列順序?qū)D形布局的影響。一般情況下,順序圖中的對象可以按照參與者(或客戶類)、邊界類、控制類和實體類的順序排列。6.2順序圖建模方法3.定義消息消息是順序圖中最重要的元素,每個消息都表示了兩個對象之間的交互。對于每一個消息,需要明確消息的發(fā)送者、接收者、消息名稱、消息內(nèi)容、消息的類型、守衛(wèi)條件和約束等多方面的建模細(xì)節(jié)。每條消息都需要明確地指定一個合適的名稱,明確指定發(fā)出者和接收者,當(dāng)在現(xiàn)有的對象中找不到合適的接收者時,就意味著發(fā)現(xiàn)了新的對象作為消息的接收者。對于每一條消息,當(dāng)消息表示方法調(diào)用時,消息名實際上就是接收者的一個方法名。當(dāng)接收者沒有合適的方法處理這種消息時,一種可能是選擇的接收者不合適,需要更換接收者,另一種可能是需要在選擇的接收者中添加一個新的合適的方法的接收消息。消息內(nèi)容是指消息的參數(shù),也可以看成是傳遞消息的兩個對象之間的通信協(xié)議。必要時需要為消息指明消息的形式和內(nèi)容。消息可以有多種不同的類型,建模時可根據(jù)建模目標(biāo)標(biāo)明消息的類型。不同的建模工具支持不同的消息類型,需要明確區(qū)分的包括:消息的同步方式和異步方式;對于同步消息還要區(qū)分是過程調(diào)用消息、創(chuàng)建消息,還是銷毀對象消息。對于返回消息還要考慮是否有可能是一個回調(diào)消息等;守衛(wèi)條件指消息的發(fā)送條件,必要時需要指明消息的發(fā)送條件,UML沒有強(qiáng)制規(guī)定發(fā)送條件的結(jié)構(gòu)化描述方式,但建模人員還是應(yīng)該以易于理解的方式描述這些條件。當(dāng)你的建模工具支持組合片段時,還可以使用組合片段描述圖中交互之間的各種關(guān)系。這有助于加強(qiáng)對模型的一致性的理解。6.2順序圖建模方法總之,建模時可根據(jù)建模目標(biāo)和建模對象,有選擇地建模這些細(xì)節(jié)。有時為提高工作效率,不必要描述所有具體細(xì)節(jié)。例如,本書表4-1中所描述的收銀用例的基本事件流,就可以建模成如圖6-7所示的順序圖。一個完整的用例將有多個事件流,如基本流、異常流和可選流。為一個用例的所有場景建模將得到一個全景的用例描述。從中可以獲得用例在某個抽象層次上需要的所有參與者、對象以及對象之間的交互。6.2順序圖建模方法圖6-7收銀用例的基本事件流6.3通信圖的構(gòu)成元素通信圖(CommunicationDiagram)用于表示一個結(jié)構(gòu)事物用于表達(dá)靜態(tài)結(jié)構(gòu)和動態(tài)行為的概念組合,表達(dá)不同事物相互協(xié)作完成一個復(fù)雜功能。大多數(shù)情況下,通信圖與順序圖表述的是相似的信息。通信圖強(qiáng)調(diào)的是發(fā)送和接收消息的對象之間的組織結(jié)構(gòu)。一個通信圖顯示了一系列的對象和在這些對象之間的聯(lián)系以及對象間發(fā)送和接收的消息。對象可以是命名對象或匿名對象,也可以是其他事物的實例,例如協(xié)作、組件和結(jié)點(diǎn)。可使用通信圖來說明系統(tǒng)的動態(tài)情況。通信圖使描述復(fù)雜的程序邏輯或多個平行事務(wù)變得更加容易。通信圖的主要構(gòu)成元素包括:對象(Object)、鏈(Link)和消息(Message)等。其中的對象可以是邊界類、控制類和實體類等類型的對象。6.3.1對象(Object)對象是通信圖的主要構(gòu)成元素。在通信圖中,對象用一個帶有對象名的矩形框來表示。每一個對象可以是命名對象,也可以是一個匿名對象。常見的對象可以是參與者、邊界對象、控制對象和實體對象。圖6-8列出了通信圖中常見的對象。可以看出,通信圖中可以出現(xiàn)的對象和順序圖中可以出現(xiàn)的對象是相同的,不同的是通信圖中的對象沒有生命線了。圖6-8通信圖中常見的對象6.3.1對象(Object)通信圖中的對象也有生命期的描述問題,通信圖中對象的生命期可使用一組與對象的創(chuàng)建和撤銷有關(guān)的約束加以表示。如{new}表示對象創(chuàng)建,{destroy}表示撤銷對象,而{transient}表示臨時對象。使用時,可將這些約束放在對象名的后面。。6.3.2鏈接(Link)鏈接(Link)表示通信圖中對象之間的鏈接關(guān)系,也是類關(guān)聯(lián)的實例。表示通信圖中的對象之間的鏈接關(guān)系,事實上也是這些對象之間可訪問性的一種實現(xiàn)。通信圖中,鏈接用對象之間的一條直線表示。如圖6-9中就包含了三個鏈接,這三個鏈接分別表示了這些對象之間的鏈接,當(dāng)然也表示了這些類之間應(yīng)該存在的連接關(guān)系。6.3.3消息(message)通信圖中的消息的含義、分類、表示方法和語法格式與順序圖中的消息基本相同。不同的是,通信圖中的消息必須使用標(biāo)號來表示消息的傳遞順序和嵌套關(guān)系。圖6-9中就包含了多個消息,這些消息的傳遞順序和嵌套關(guān)系則由這些消息的類型和順序加以描述。整張通信圖就表示了Customer、CardProcessor、Cashier和CashRegister四個對象為完成某個系統(tǒng)任務(wù)所進(jìn)行的協(xié)作。它所能帶來的模型增量就可能包括:對象(或類)、鏈(或類關(guān)聯(lián))、消息(方法)甚至包括某些屬性。6.3.3消息(message)圖6-9通信圖實例6.3.4通信圖中的主動對象(ActiveObject)就像前面在第一章中討論過的,可以根據(jù)其行為的自主性將對象劃分成主動對象和被動對象。一般情況下,一個軟件至少需要含有一個主動對象。只有一個主動對象時,主動對象的概念并不被特別關(guān)注。但當(dāng)系統(tǒng)含有多個主動對象時,情況則完全不同了。主動對象之間的協(xié)作就具有并發(fā)性這一重要的特點(diǎn)了。通信圖中可以包含多個主動對象,主動對象(或主動類)可以用Active屬性表示,帶有粗框的對象表示。一般情況下,可以考慮將能夠接受并處理異步消息的對象建模為主動對象。原因是其可能啟動了一個新線程并在這個線程中來處理這個消息,當(dāng)然有時也可能僅僅把這個消息傳遞給另一個主動對象,這是這個對象本身也不一定是主動對象。例如,圖6-10給出了一個主動對象建模的例子。6.3.4通信圖中的主動對象(ActiveObject)圖6-10帶有主動對象的活動圖6.3.4通信圖中的主動對象(ActiveObject)圖中的控制器(controller)、鍋爐(boiler)、溫度傳感器(TemperatureSensor)和壓力傳感器(PressureSenser)等四個對象均為主動對象。值得注意的是,圖中的消息應(yīng)使用異步消息來進(jìn)行描述。6.3.4通信圖中的主動對象(ActiveObject)UML使用活動類建模主動對象,活動類實例化后就自己控制它自己的行為,它不能其他對象調(diào)用或激活,它可以獨(dú)立運(yùn)作,并定義其自己線程的行為。主動對象之間通過異步事件的方式進(jìn)行通信。一個有趣的問題是,這張含有多個主動對象的通信圖可以轉(zhuǎn)換成順序圖嗎?使用建模工具提供的轉(zhuǎn)換功能,可得到圖6-11所示的順序圖。由于圖中的Temperature和Pressure是兩個獨(dú)立的主動對象,所以,它們發(fā)出的消息的時間順序一定是不確定的。而圖6-11并沒有給出一個對這個問題的準(zhǔn)確描述。在圖6-11中加入帶有并發(fā)片段的組合片段可以解決這個問題。另外,圖6-10中的通信圖中描述了鍋爐和兩個傳感器之間的鏈接,而在圖6-11中的順序圖中,則不能直觀地看到這樣的鏈接了。因此,在某些情況下,順序圖和通信圖的建模不能單純地依靠自動轉(zhuǎn)換就可以得到完全等價的結(jié)果。6.3.4通信圖中的主動對象(ActiveObject)例如,圖6-12給出了一張與圖6-6等價的活動圖,仔細(xì)觀察一下可以發(fā)現(xiàn),圖中不再包含那個表示重復(fù)輸入的那個frag

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論