1. 程式人生 > >系統架構設計——學習篇之類的設計(UML)

系統架構設計——學習篇之類的設計(UML)

概述

“程式設計是一門技術,更加是一門藝術,不能只滿足於寫完程式碼執行結果正確久完事,時常考慮如何讓程式碼更加簡練,更加容易維護,容易擴充套件和服用,只有這樣才可以真正得到提高。寫出優雅的程式碼真的是一種很爽的事情。UML類圖也不是一學就會的,需要有一個慢慢熟練的過程。所謂學無止境,其實這(類的設計)才是理解面向物件的開始。” ——大話設計模式

對於初學者來說,我們不僅僅是要學會面向物件的封裝、繼承和多型,我們更應該在理解的基礎上把這些思想運用到我們的編碼當中。在我學習過JAVA過後的很長一段時間,很少真正思考過,類與類之間除了繼承、實現和隸屬(包含)的關係還有哪些。而當我碰到問題的時候再去思考如何更改類的設計。所以在我們開始整個專案之前,我們應該儘可能的想好每一個類該如何去設計,類與類該如何處理他們的關係,這樣我們再進行模式和業務設計的時候才不至於遇到問題了再重新思考。這也是實現程式碼複用,實現高內聚低耦合的必要條件。

下面我們從UML的類圖出發,學習一下類的設計

1. 類(class)

在我看來,類可以看做面向物件程式設計的單位,是封裝、繼承和多型的最小元素。在面向物件的思想中,一切萬物皆物件。
在UML中類圖分三層,第一層顯示類的名稱,如果是抽象類,則就用斜體顯示。第二層是類的特性,通常就是欄位和屬性。第三層是類的操作,通常是方法和行為。
其中,“+”表示public,“-”表示private,“#”表示protected。
這裡寫圖片描述

2. 繼承(extend)

這是面向物件程式設計的三大特性之一。在UML中使用三角形和實線來表示的。
這裡寫圖片描述
程式碼表示為

public class Bird extend Animal
{
    ...
}

3. 實現(implements)

Java介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
這裡寫圖片描述
程式碼表示為

public class Bird extend Animal implements Flyable
{
    public void fly(){
        ...
    }
}
public interface Flyable
{
public abstract void fly(); }

4. 依賴(Dependency)

依賴可以按照必要條件來理解,簡單地理解就是依存的關係,但不是相互依存。一般此關係表示在構造方法中,以引數的形式傳入。這就表達瞭如果沒有引數,那麼也就無從構造的依存關係。
這裡寫圖片描述
程式碼表示為

public class Animal
{
    private Oxygen oxygen = null;
    private Water water = null;
    public Animal(Oxygen o,Water w){
        this.oxygen = o;
        this.water = w;
    }
}

5. 組合(Composition)

組合關係也是一種強的”擁有”關係,與依賴不同的是,組合中的元件是可以是由自身建立的。按前面的例子來說,依賴關係的兩者其實是獨立產生的,只是一方的存在依賴於另一方。而組合中的雙方,是一方擁有另一方,體現了嚴格的部分和整體的關係,部分和整體的生命週期一致
這裡寫圖片描述
程式碼表示為

public class Bird
{
    private Wing wing;
    public Bird(){
        wing = new Wing();
    }
}
public class Wing
{
    ...
}

6. 聚合(Aggregation)

聚合表示一種弱的“擁有”關係,體現的是A物件可以包含B物件,但B物件不是A物件的一部分。相比於上面的組成關係,區別在於組成關係的元件的生命週期與整體是相同的,如果鳥死了,那麼他的翅膀也就不能用了(如果你認為死去鳥的翅膀還可以移植到別的鳥身上繼續使用,那麼鳥和翅膀其實就是聚合關係,具體的解釋稍後再說)。而聚合關係中的整體和部分是相對弱化的,就像鳥群是有鳥組成的,如果沒有鳥群,鳥還是鳥
這裡寫圖片描述
程式碼表示為

public class Bery
{
    private Bird[] arrayBirds;
    public abstract void SouthwardMigration();
    ...
}

7. 關聯(Association)

類與類之間的聯接,它使一個類知道另一個類的屬性和方法。例如如果A依賴於B,則B體現為A的全域性變數。關聯關係有雙向關聯和單向關聯。雙向關聯:兩個類都知道另一個類的公共屬性和操作。單向關聯:只有一個類知道另外一個類的公共屬性和操作。大多數關聯應該是單向的,單向關係更容易建立和維護,有助於尋找可服用的類。關聯關係在所有的關係中屬於最弱的關係。
這裡寫圖片描述
程式碼表示為

public class Bird
{
    private Climate climate;
}
public class Climate
{
    private String season;
    ...
}

8. 關聯、聚合、組合、依賴之間的關係

他們各自的定義之前都說過了,這裡只是想說一個問題,就是四者的關係其實都是相對的,這裡拿男女關係做一個比喻,相比大家能更好的理解:

  1. 男女關係最開始的時候,雙方剛剛認識,這時候要麼男方對女方有意思,要麼女方對男方有意思,再或者雙方都有好感,那麼雙方的關係就是關聯關係,只是單純的把對方留意一下。這就是關聯關係,只是一方知道另一方。
  2. 通常來說,我們的異性朋友不止一個,即便是男方對女方有意思,女方也是男方眾多異性朋友中的一個,女方亦然。這些異性朋友其實就是一個聚合。所以,如果站在女方的角度,她和男方是關聯的關係,如果站在異性朋友的角度,女方只是男方的異性朋友之一,女方和異性朋友就是聚合關係。這也就說明了,關係其實都是相對的。
  3. 接下來,雙方結果相戀、相愛,最後走入婚姻的殿堂,組成了他們的家庭。這時候站在家庭的角度,他們和家庭之間就是一種組合關係。值得注意的是,如果家庭破裂了,丈夫和妻子的角色也就不存在了。嚴格體現了整體和部分的關係,生命週期是一樣的。
  4. 家庭的維持是需要收入來源的,一般來說,男方是這個家庭的頂樑柱,那麼家庭相對於男方的關係就是依賴關係。而家庭破裂了,男方一樣有經濟來源,所以二者的生命週期是不一樣的。

至此,我們就要進入下一階段的學習了——設計模式。

注意:轉載請標明,轉自itboy-木小草
尊重原創,尊重技術。