1.2 《硬啃設計模式》 第2章 學習設計模式需掌握的UML知識

張傳波(Fireball)發表於2013-10-24

要看懂設計模式,你需要懂類圖(Class Diagram),也需要懂一點物件圖(Object Diagram),下面介紹一些UML的必要知識,以便你學習設計模式。


屬性、操作


下圖簡單介紹類的屬性和操作。 類有屬性(attributes)、操作(operations),屬性和操作統稱特性(features)。
1.jpg 

 

下圖進一步詳細介紹類圖細節,包括:屬性和操作的作用域、屬性型別、引數型別、方法返回值型別等。
2.jpg

 

介面、列舉


3.jpg

 

抽象類
4.jpg

 

繼承關係


類B繼承類A,如下圖:
5.jpg

 

抽象類被繼承,如下圖:
6.jpg

 

實現關係


實現是指某介面被實現,而不是某類被例項化。 實現如下圖:


7.jpg

 

依賴關係


先看圖:
8.jpg

B依賴A,表示如果A的介面發生變化,B也需要相應地改變。

依賴的常見情況有:

1. B呼叫了A的方法。

2. B的方法中,使用了A為引數。

3. B的方法返回值型別為A。

 


引用關係


先看圖:
9.jpg

Class1有箭頭指向Class2,表示Class1中含有Class2的引用。 而上圖進一步明確了具體的引用方式,就是:Class1中的私有變數m_Class2的型別是Class2。


你可能會問:某類保持另外一個類的引用,一般都會呼叫另外一個類的方法,那麼它們的關係不應該是依賴關係嗎?引用關係與依賴關係有什麼區別?

這個問題很好!某些情況下,某類保持另外一個類的引用,但該類不呼叫另外一個類的方法,而是將另外一個類的引用暴露出來,供外部呼叫。

例如Class1有某一屬性Class2,訪問該屬性可獲得Class2的例項:

class1 = new Class1( );

class2 = class1.Class2;

Class1雖然有Class2的引用,但它自身不呼叫Class2的方法,而是讓外部通過熟悉獲得Class2的例項。


不過很多資料及書籍對“依賴關係”及“引用關係”的解釋並不到位,不同資料之間的解釋甚至是互斥的。而我見到的大部分設計模式的類圖都不會區分“依賴關係”和“引用關係”,大部分設計模式的類圖都會畫成“引用關係”,本書後面的類圖也將會不區別這兩者,全部畫成“引用關係”。

 


“包含”關係


我將“包含”關係分為“弱包含”和“強包含”,下圖上面的是“弱包含”,下圖下面的是“強包含”,此圖說明了兩種包含的區別。
10.jpg

 

“弱包含”和“強包含”只是我的一種俗稱,學術的叫法是“聚合”和“組合”,一般資料可能會搞到你很暈,下圖希望可以進一步解釋清楚。
11.jpg

設計模式的類圖中不少地方會用到“包含”關係,一些資料畫成“強包含”,一些資料畫成“弱包含”。我個人將“強包含”看成是“弱包含”的一種特例,大部分情況下我先畫成“弱包含”,有需要才轉化為“強包含”。本書中的包含關係,全部都畫成“弱包含”。

 


物件圖


類例項化後就是物件(Object),表示這些物件及物件之間關係的圖就是物件圖。有時候需要用物件圖來表示設計模式。


物件圖的例子:
12.jpg

 

 

請看下一文……

 

 

作者:張傳波

創新工場創業課堂(敏捷課程)講師

軟體研發管理資深顧問

CMMI首席專家

《火球——UML大戰需求分析》作者

www.umlonline.org創辦人

相關文章