類圖可以為我們提供大量有關在復雜結構中協同工作的類之間存在的關係的通用信息。例如,我們可以在類圖中使用組合來對組成汽車或洗衣機等自包含物理實體的組件集合進行建模。另一方面,對像圖可以用來模擬這種結構的特定實例。它們提供瞭如何使用結構以便更好地理解類圖的具體示例。複合結構圖更進一步。他們允許我們對交互進行建模 這必鬚髮生在結構化分類器實例的內部組件之間,以便執行特定的任務。
什麼是複合結構圖?
我們應該從一些定義開始。甲分類器描述了結構和行為特性的UML元素(即屬性和操作)。分類器的例子包括類,接口,數據類型,子系統和組件。甲結構分類器是一個分類,其實例化導致產生互連對象中,被稱為其的集合的內部結構。構成這個內部結構的元素被稱為屬性。屬性可以進一步分類為部分,它們代表內部結構或連接器中的特定角色。連接器是一種鏈接,允許在運行時在兩個或多個部件之間進行交互或通信。複合結構圖用於對結構化分類器(包含分類器)的內部結構進行建模,並且可以在其各個部分之間進行合作以實現某些共同目標。
當創建結構化分類器的實例時,也會創建與其屬性相對應的一組實例(儘管不一定全部在同一時間)。為每個屬性創建的實例(或多個實例)將是分類器輸入該屬性的一個實例。存在多個屬性創建實例的可能性,這取決於給定實例化中為該屬性定義的多重性。請注意,所使用的實例化方法可以接受一個或多個參數。這些參數可用於在默認實例化上產生變化。還要注意的是,當結構化分類器的實例被銷毀時,與該結構化分類器的部分相對應的所有實例都會與它一起銷毀。
零件和連接器
要創建一個結構圖,包含的分類器就像普通的類圖標一樣繪製(當然是更大)。該圖標將有兩個隔間。首先,放入包含分類的名稱。組成內部結構的部件進入第二個更大的隔間。我們使用Astah Community UML建模工具(版本6.5.1)創建了該頁面上的大部分圖表。在此軟件包中,用於包含分類的圖標稱為“結構化類”圖標。其餘的圖(包含協作,我們稍後討論)是使用Visual Paradigm for UML 8.3 Community Edition創建的,這是免費的非商業用途。這是個人計算機系統的初始結構圖。
結構化類PC的結構圖
該圖顯示我們的個人計算機有兩個組件 - 一個由Mainboard類型的一部分代表的主板和一個由Processor類型的一部分代表的處理器。很明顯,我們的模型在這個階段是不完整的,因為個人電腦需要其他幾個主要組件才能工作,但它用來說明簡單結構圖的基本特徵。一個組成部分表示由包含分類器的實例擁有的屬性的一個或多個實例。每個部分都由一個帶有實心輪廓的矩形表示,以指示包含的分類器專有地擁有該部分(與一個或多個其他分類器共享的部分也由矩形表示,但該矩形具有破碎的輪廓)。零件的名稱和類型可以在矩形內顯示如下:
name : classname
類名和冒號可以省略,這意味著該部分是未命名類的實例。在上面的例子中,我們省略了部分名稱並僅顯示了類名(通過在類名左側包含冒號來標識)。每個部分的多重性顯示在方括號內的類名稱後面(另一種表示法是將多重性放置在矩形的右上角)。為了比較目的,下面顯示了個人計算機系統的通用類圖。
個人電腦的通用類圖
類圖告訴我們,主板的一個實例可以與處理器的一個或兩個實例相關聯。這可以讓主板能夠容納兩個處理器。因此它代表了一個抽像類,因為在現實世界中,個人計算機主板的製造要么是為了容納一個處理器,要么是一個以上的處理器。結構圖更具體,因為它告訴我們在我們的個人計算機系統中只有一個處理器實例,並且這些部分是鏈接的某種程度上來說。我們知道它們之間是相連的,因為它們由一個連接器連接起來,連接器由連接這兩個部分的實線表示。連接器表示它連接的部件實例之間的邏輯和/或物理連接。下面舉例說明更類似於類圖的方法。
具有單個處理器的個人計算機系統
類圖現在將主板和處理器類顯示為其中主類稱為BasicPC的組合的一部分。該圖告訴我們,我們的個人計算機系統包含一個主板和一個處理器,並且在組成內主板和處理器類具有一對一的關係。我們進一步開發複合結構圖,以包括我們個人計算機系統所需的其他主要組件。以下是仍然需要的組件列表:
- 電源單元(PSU)
- 硬盤驅動器(HDD)
- DVD-RW光驅(DVD-RW)
- 內存模塊(MM)
我們暫時假定主板是內置聲卡和顯示適配器的類型。下面是我們更新的複合結構圖:
現在復合結構圖包含了所有主要組件
現在,複合結構圖具有典型的入門級個人計算機內的所有主要組件,以及所需的電源,數據和控制鏈路。大多數零件都標有其名稱和類型(兩個存儲器模塊除外,圖中未單獨顯示)。如果您對如何將個人電腦放在一起有一定的了解,則不會覺得該圖太難理解。例如,您將知道處理器通過插座連接到主板(或者有時稱為主板)內置於主板中。該套接字在任何時候都只能容納一個物理處理器(當然這可能是一個多核處理器,但目前並不擔心)。
計算機系統有兩個存儲器模塊,但是這些存儲器模塊在圖中以單個部件顯示,具有多個兩個。內存模塊在主板上有各自特殊的插槽,但由於其細長形狀,它被稱為插槽。我們的主板有兩個內存插槽,可以容納兩個內存模塊。將存儲器模塊連接到主板的連接器在兩端顯示為具有多個,這意味著將存在兩個連接器實例。該圖告訴我們將會有兩個MM(用於表示內存模塊的類)和兩個插槽。
我們使用一個端口(由一個小方框表示)顯示了內存插槽(以及所有其他連接點),其中有一個端口,其數量為兩個。我們將很快了解更多關於港口的信息。目前,只需注意內存模塊所連接的端口實際上代表兩個獨立的內存插槽,如其多重性所示。這是這種安排的另一種表述:
主板/內存模塊配置的替代表示
現在兩個插槽由兩個獨立的端口代表。內存模塊也單獨顯示,並且現在命名端口和內存模塊實例。我們選擇不使用原始圖表上的這種排列方式來減少混亂(在任何情況下都假設存儲器模塊是相同的)。請注意,由於端口,內存模塊實例和連接器端點(連接器端點的多樣性決定了它可連接的可連接元件的數量)可能會被假設為多個,因此可以省略多個點。
請注意,連接器可以是關聯的運行時實例(如類圖中使用的那樣),也可以表示在運行時設置的某種動態鏈接,以促進結構各部分之間的通信。例如,可以創建連接器,以便啟用操作或便於更新實例變量。如果沒有示出多個連接器端部,則假定其具有與連接器的該端部連接的部件相同的多樣性。如果連接器端連接到內部結構的零件上的一個端口,並且沒有顯示多重性,則假定它的多重性為端口的多重性(如果有的話)(端口將在短期內討論)。
可能發生在連接器上的通信類型可能受到限制,包括適用於連接到它們的部分(可以使用適當的表示法顯示)的那些類型。使用下面顯示的語法,連接器的名稱和類型可以以與部件相同的方式顯示。
名稱:classname
請注意,通常不必為連接命名,除非為了清晰起見必須唯一標識連接。我們的個人計算機系統複合結構圖僅顯示連接電源單元,主板,光驅和硬盤的電源連接器和信號電纜的連接類型。將內存模塊和處理器端口連接到主板端口的連接器根本沒有標記,因為它們只是表示處理器與其插槽之間以及內存模塊與插槽之間的物理接口。
順便說一下,我們在個人計算機系統的複合結構圖中使用的端口數量反映了系統中的每個組件均可升級的事實。因此,每個組件都使用定義良好的行業標準接口連接到系統中的一個或多個其他組件(這使得意外地將兩個不兼容的組件連接在一起非常困難)。下面將更詳細地討論端口和接口的概念。
端口
甲端口,在複合結構圖的上下文中,是用作結構化分類器和它的環境之間的接口,一個結構化的分類器內的結構化的分類器和其部分,或所述部分之間的任何點。端口在分類器(即部件,類或組合結構)的邊界上顯示為小方形輪廓,並表示其任何實例的外部可見部分。該符號附近可能會顯示該端口的名稱,類型和多樣性。在結構化分類器的邊界上繪製的端口默認為公共的。這意味著它可以被分類器之外的實體訪問。完全在邊界內繪製的端口受到保護默認情況下,只能由分類器內的實體訪問。您已經在個人計算機系統的複合結構圖上看到了正在使用的端口符號(參見上文)。
一個端口通常與一個或多個接口關聯。接口指定可以通過端口進行的交互的類型。指定分類提供服務的接口,以它的環境被稱為一個提供接口。指定分類器在其環境中需要的行為的接口稱為必需接口。外部分類器可以通過給定端口訪問分類器提供的功能,只要它們符合該端口的指定行為要求。作為一個例子,考慮個人電腦系統中的硬盤驅動器。驅動單元通過兩個獨立的接口與其環境交互(見下文)。一個是需要的接口,可以從電源單元接收電力。第二個是提供的接口,允許它提供通過主板接收的數據存儲和數據檢索請求。
HDD類的 複合結構圖
標題為“類圖”的頁面給出了一個示例類圖,其中使用類圖標表示接口。該接口確實可以被建模為一個類,儘管它總是一個抽像類,不能實例化。接口的實現可以歸結為具體的類,它必須實現接口指定的功能。接口的已定義功能已暴露(對外部實體可見),並且任何希望通過其一個端口使用結構化類的服務的實體可以通過指定要使用的接口的名稱來實現,而不必擔心內部實現的細節。接口規範的抽象性意味著它可以由任意數量的類實現。實現之間的差異並不重要,按指定提供每個實現功能。
在復合結構圖中,通常使用稱為球窩表示法的更方便的表示法來表示接口。從上面的例子可以看出,一個提供的接口被表示為一個球(一個輪廓圓),一個所需的接口被表示為一個套接字(一個半圓)。接口符號通過實線連接到端口,端口又連接到實現接口的內部分類器(即實現接口的功能)。在我們的例子中,我們包含了一個插圖,顯示了HDDCtrl的類圖標類,因為它會出現在類圖上,以及它實現的抽象接口。提供對由內部分類器實現的接口的已發布功能的訪問的端口被稱為服務端口。
如果擁有該端口的分類器實現了端口本身的功能(而不是由其內部分類器之一實現的功能),則該端口被稱為行為端口。如果是這種情況,則端口通過連接器鏈接到分類器內的小型狀態符號,以指示它是行為端口。默認情況下,屬於復合結構的端口是服務端口而不是行為端口。行為端口有時可以在簡單(而不是複合)分類器上找到。我們可以想像如下所示建模HDDCtrl類。端口p提供的功能由HDDCtrl類實現,它實現了diskAccess接口。
行為端口既屬於同一類,也屬於同一類
可以通過顯示端口的名稱來顯式鍵入一個端口,後跟一個冒號,接著是實現接口的分類器的名稱。或者,用於表示接口的球和球座符號可以通過使用接口的名稱鍵入端口來替換。這兩種方法的例子如下所示。
可以使用類的名稱(左側)或接口(右側)鍵入端口
當幾個不同但相關的服務可以通過相同的端口訪問時,端口也可以提供多個接口。下面的示例顯示了由單獨的界面圖標表示的每個界面。可以使用單個接口來表示所有接口(端口的名稱出現在接口圖標附近,後面跟冒號,後跟逗號分隔的與端口相關的接口列表)。
一個端口可以提供多個接口
分類器也可以與多個端口相關聯,從而根據通過其接收消息的端口實現不同類型的交互。分類器甚至可以實現多個接口。
分類器可以實現多個端口的接口
一個端口也可以連接多個實現相同接口的內部元件,如下例所示。
多個分類器可以實現相同的接口
合作
甲協作描述如何結構化分級器內的兩個或更多個元件在運行時,以執行特定的任務合作。甲協作圖表示合作為虛線橢圓形,與它裡面的協作的名稱,如下所示。協作中涉及的角色可以繪製在橢圓內的一個單獨的隔間中,並使用實線顯示它們之間的連接。每個角色都繪製為一個矩形圖標,角色名稱顯示在圖標內。角色只能由擁有協作的結構化分類器中的元素播放。在協作中扮演角色的每個元素都成為一個屬性該合作。元素所扮演的角色之間的連接必須與結構化分類器中這些元素之間的對應連接相匹配。
銷售是兩個角色 - 買方和賣方之間的合作
協作的抽象性意味著它不能直接實例化。事實上,一個角色可以由一個結構化分類器中的多個元素播放。給定元素在結構化分類器所擁有的不同協作中扮演不同的角色也是可能的。由於協作圖的目的通常是描述結構化類功能的某些特定方面,因此可以省略不必要的細節,參與實例的確切身份或類也可以省略。結構化分類器向其環境提供的功能通常由其呈現給該環境的接口定義。協作可以選擇性地只關注其中一個接口,
協作與結構化分類器的關聯稱為協作發生,並表示協作表示該分類器功能的某個方面。使用虛線橢圓在復合結構圖上顯示協作事件,如下所示。協作的名稱遵循事件的名稱,兩個名稱之間用冒號分隔。從出現點到分類器圖標繪製了一條虛線,箭頭指向分類器以指示分類器使用的協作。該行標有關鍵字«發生»。
協作單位在使用分配分類
相同的符號用於表示協作表示分類器,但所用的關鍵字是«表示»。
此次合作銷售代表分佈分類
術語協作使用用於描述協作對特定情況的應用,特定的類或實例扮演不同的角色。協作中的每個角色都稱為供應商。每個扮演角色的元素都被稱為客戶。協作使用將結構化分類中的客戶端元素綁定到協作中的供應商角色。角色和扮演角色的元素之間的關係稱為角色綁定。所有客戶端元素都必須屬於同一個結構化分類器,並且所有供應商元素都必須屬於同一個協作。
協作用途顯示為一個虛線橢圓,其中協作發生的名稱後面跟著協作類型的名稱,用冒號分隔兩者。協作中涉及的每個客戶端元素均顯示在橢圓外的其自己的矩形圖標中。角色綁定顯示為從橢圓到客戶端元素的虛線,在客戶端用供應商元素的名稱標註。給定協作的多次發生可能適用於結構化分類器,每個結構化分類器都涉及不同的角色和連接器集。同樣的道理,同一個角色或連接器可能涉及多個協作事件或多個不同的協作。以上,我們展示了Sale的發生協作屬於稱為分佈的結構化分類器。這是分佈組合結構圖可能如下所示:
分佈的 複合結構圖
如下所示,我們可以創建一個涉及分銷商的批發商和零售商屬性的銷售協作的協作使用(您應該能夠確定可以為其創建協作使用的其他兩個場景)。
Sale協作 的批發協作使用
在另一個合作的定義中使用一種協作是完全可以接受的。查看分佈結構分類器,可以看出,某種銷售可能發生在三個層次上。從製造商到零售客戶的整個供應鏈都可以建模為分配分類器所代表的所有實體之間的協作。批發商直接從製造商那裡購買商品並將其出售給零售商,然後零售商將其出售給零售客戶。購買和銷售因此發生在供應鏈的三個層面。我們可以使用下面顯示的SupplyChain協作模擬此場景。你可以從圖中看到Sale協作被用於SupplyChain協作的定義三次。的角色,買家和賣家都通過不同的客戶在供應鏈模型中的每個水平發揮。
在供應鏈合作