學習設計模式的過程中,發現相關的作者們都會用UML類圖來表示一個模式的整體脈絡,這種方式確實直觀明瞭,既能體現巨集觀思路、又能兼顧實現細節。真的是很妙的工具。在開始正式學習設計模式之前,有必要對UML有個大概的掌握。然後,日後有望解鎖更多關於UML方面的技能,比如說:建模。哈哈,有點小興奮呢。 UML ...
學習設計模式的過程中,發現相關的作者們都會用UML類圖來表示一個模式的整體脈絡,這種方式確實直觀明瞭,既能體現巨集觀思路、又能兼顧實現細節。真的是很妙的工具。在開始正式學習設計模式之前,有必要對UML有個大概的掌握。然後,日後有望解鎖更多關於UML方面的技能,比如說:建模。哈哈,有點小興奮呢。
UML全稱Unified Modeling Language(統一\標準建模語言),旨在為軟體開發提供可視化、模型化的工具。可見,UML既是一種建模工具,也是一種“交流語言”。
一、UML類圖的基本元素
1 類的結構
UML用內含三層“格子”的矩形框表示類,如圖:
最上層為類的名稱;中間為類的欄位和屬性;最下層為類的行為和方法。
如果為抽象類,類名用斜體標識。
2 訪問修飾符
public、private、protected分別用 + - # 來表示
至於C#中的 internal、protected internal修飾符,則沒有對應的符號。(UML是通用的標記語言,而後兩種修飾符屬C#等少數語言)
3 介面表示
有兩種方法矩形表示法和棒棒糖表示法(截圖來自《大話設計模式》)
二、 相互關係
UML類圖中,類與類、介面與類之間的關係一共有泛化(Generalize)、實現(Realization)、依賴(Dependency)、關聯(Association)、聚合(Aggregation)、組合(Composition)六種。這幾種表示的相互作用關係依次加強。
1 泛化(Generalize)
泛化即子類、子介面繼承父類、父介面的功能,並能擴張自己新的功能的能力,是一種 is-a(一般與特殊)的關係。貓繼承了動物,那麼就可以說貓是動物的泛化,貓 is a 動物。
UML用空心的三角箭頭+實線來表示泛化或繼承。
2 實現(Realization)
即類實現介面的功能。
對於矩形表示法,用空心三角箭頭加虛線表示;對於棒棒糖表示法,則把棒棒糖直接插在實現介面的類上(JUDE的棒棒糖不太好看)。
3 依賴(Dependency)
一個類依賴另一個類的定義。比如人需要用手機打電話,那麼人依賴手機。依賴關係總是單向的。依賴具有偶然性、臨時性,且關係非常弱。依賴在具體的代碼層面,表現為(類A依賴類B):
類B作為參數被類A使用;
類B以局部變數的形式存在於類A的方法中;
類A調用類B的靜態方法。
UML中用簡單箭頭加虛線表示依賴:
4 關聯(Association)
一個類需要知道另一個類的狀態(屬性、方法)。關聯體現的是類與類或介面之間的強依賴關係,相比於依賴關係,這種關係是長期性的,而且雙方的關係一般是平等的。在代碼層面(A關聯B),B以類屬性的形式出來在A中,或A引用了一個類型為B的全局變數。
UML中,用簡單實線箭頭表示單向關聯,用雙箭頭或不使用箭頭表示雙向關聯。但為了降低耦合,雙向關聯不建議使用。
關聯箭頭的頭和尾都可以添加基數標識,用來表示有幾個實例。
5 聚合(Aggregation)
關聯關係的一種特例,是強的關聯關係,也是一種是整體和個體的關係(has-a)。普通的關聯關係的兩個類處於同一層級,但聚合關係的兩個類處於不同層級,比如公司和員工。同時這又是一種弱的擁有(has-a)關係。因為整體和個體之間是可分離的,他們有各自獨立的生命周期。個體可以屬於多個整體,也可以被多個整體共用。關於在代碼層面的的實現,沒有特定的標準,最可靠的識別方法為通過語義。如下為一種實現了聚合的代碼:
public class Company
{
List<Employee> list;
}
UML中使用空心菱形加實線來表示
6 組合\結合(Composition)
組合也屬與關聯的特例,是比聚合更強的關聯關係,而且整體與部分的生命周期一致(contains-a)。比如胳膊與人體。如下為一種代碼實現:
public class Body
{
private Arm arm;
public Body()
{
arm=new Arm();
}
}
UML中用實心菱形加實線來表示
三、總結
六種關係的關聯程式從低到高為:泛化<實現<依賴<關聯<聚合<組合
泛化為is-a關係,關聯為has-a關係,其中,聚合、組合為關聯的特例,組合代表的關係最為緊密,是一種contains-a關係
聚合與組合的區別:
1)主要體現在關係成員的生命周期是否相同;
2)被聚合的類,還可以繼續被其他類聚合;但被組合的類則不能再屬於其他類。
關聯和聚合的區別:
主要的差別在於抽象層級,關聯在同一抽象層級,聚合在不同層級。
關於UML,目前就學這點皮毛吧。