學習UML實現、泛化、依賴、關聯、聚合、組合

峻峰飛陽發表於2017-03-06

類之間的關係種類:Realization(實現), Generalization(泛化),Dependency(依賴)、Association(關聯)、Aggregation(聚合)、Composition(合成或組合)。 其中,Aggregation(聚合)、Composition(合成)屬於Association(關聯),是特殊的Association關聯關係。


實現(Realization):

    指的是一個類實現介面(可以是多個)的功能;實現是類與介面之間最常見的關係;C 中沒有直接的介面而是通過在類中定義純虛擬函式來實現的。

    UML圖中實現使用一條帶有空心三角箭頭的虛線指向介面。如下

程式碼示例:

  1. Class animal
  2. {
  3.  public:
  4.   Roar() =0;
  5. }

  6. Class Cat:public animal
  7. {
  8.  public:
  9.   Roar(){cout<<”cat”;}
  10. }

  11. Class dog:public animal
  12. {
  13.  public:
  14.   Roar(){cout<<”cat”;}
  15. }

泛化(Generalization)

   表現為繼承或實現關係(is a)。具體形式為類與類之間的繼承 關係,介面與介面之間的繼承關係,類對介面的實現關係

UML圖中實現使用一條帶有空心三角箭頭的實線指向基類。如下

程式碼示例:

  1. Class shape
  2. {
  3.   public:
  4.    Display(){cout<<”shape”;}
  5. }

  6. Class rectangle: public shape
  7. {
  8.    public:
  9.      Display(){cout<<” rectangle”;}
  10. }

  11. Class circle: public shape
  12. {
  13.    public:
  14.    Display(){cout<<” circle”;}
  15. }

依賴 (Dependency)

表現為函式中的引數(use a)。

是類與類之間的連線,表示一個類依賴於另一個類的定義,其中一個類的變化將影響另外一個類。例如如果A依賴於B,則B體現為區域性變數,方法的引數、或靜態方法的呼叫。如電視(TV)依賴於頻道(channel)常見的依賴關係如下:

   (1)類B以引數的形式傳入類A的方法。

   (2)類B以區域性變數的形式存在於類A的方法中。

   (3)類A呼叫類B的靜態方法。

UML圖中實現使用一條帶有箭頭的虛線指向被依賴的類。如下

程式碼示例

  1. class chaanle
  2. {
  3.  public:
  4.    play(){cout<<"play";}
  5. }
  6. class TV
  7. {
  8.   public:
  9.    onplay(channel &chan)
  10.    {
  11.      chan.play();
  12.    }
  13. }

關聯(Association)

表現為變數(has a )。

類與類之間的聯接,它使一個類知道另一個類的屬性和方法。例如如果A依賴於B,則B體現為A的全域性變數。如person類和company類

關聯關係有雙向關聯和單向關聯。

雙向關聯:兩個類都知道另一個類的公共屬性和操作。

單向關聯:只有一個類知道另外一個類的公共屬性和操作。

大多數關聯應該是單向的,單向關係更容易建立和維護,有助於尋找可服用的類。

UML圖中實現使用一條實線連線相同或不同類

聚合(Aggregat ion)

是關聯關係的一種,是強的關聯關係。聚合關係是整體和個體的關係。普通關聯關係的兩個類處於同一層次上,而聚合關係的兩個類處於不同的層次,一個是整體,一個是部分。同時,是一種弱的“擁有”關係。此時整體與部分之間是可分離的,他們可以具有各自的生命週期, 部分可以屬於多個整體物件,也可以為多個整體物件共享;比如計算機與CPU、公司與員工的關係等;表現在程式碼層面,和關聯關係是一致的,只能從語義級別來 區分;

UML圖中實現使用一條帶有虛心菱形的線來表示

 

組合(Composition)

是關聯關係的一種,是比聚合關係強的關聯關係。它要求普通的聚合關係中代表整體的物件負責代表部分的物件的生命週期。Composition(組合關係)是一種強的“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一致。他同樣體現整體與部分間的關係,但此時整體與部分是不可分的,整體的生命週期結束也就意味著部分的生命週期結束;比如你和你的大腦,window視窗和frame,在視窗中建立一個frame時必須把它附加到視窗上,當視窗消失時frame也就消失了;表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分;

UML圖中實現使用一條帶有實心菱形的線來表示

幾種關係所表現的強弱程度依次為:組合>聚合>關聯>依賴

聚合和組合的區別:

    聚合關係是“has-a”關係,組合關係是“contains-a”關係;聚合關係表示整體與部分的關係比較弱,而組合比較強;聚合關係中代表部分事物的物件與代表聚合事物的物件的生存期無關,一旦刪除了聚合物件不一定就刪除了代表部分事物的物件。組合中一旦刪除了組合物件,同時也就刪除了代表部分事物的物件。我們用淺顯的例子來說明聚合和組合的區別。“國破家亡”,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關係。而相反的,計算機和它的外設之間就是聚合關係,因為它們之間的關係相對鬆散,計算機沒了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關係中,部分可以獨立於聚合而存在,部分的所有權也可以由幾個聚合來共享,比如印表機就可以在辦公室內被廣大同事共用

   聚合和組合的區別則在語義和實現上都有差別,組合的兩個物件之間其生命期有很大的關聯,被組合的物件是在組合物件建立的同時或者建立之後建立,在組合物件銷燬之前銷燬。一般來說被組合物件不能脫離組合物件獨立存在,而且也只能屬於一個組合物件,例如一個文件的版本,必須依賴於文件的存在,也只能屬於一個文件。聚合則不一樣,被聚合的物件可以屬於多個聚合物件,例如一個員工可能可以屬於多個公司

關聯和聚合的區別:

    關聯和聚合的區別主要在語義上,關聯的兩個物件之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的,例如一個公司包含了很多員工,其實現上是差不多的。

相關文章