天天看點

設計模式中類的關系之關聯關系(Association)

      關聯關系是類與類之間最常用的一種關系,它是一種結構化關系,用于表示一類對象與另一類對象之間有聯系。它展現的是兩個類、或者類與接口之間語義級别的一種強依賴關系,比如我和我的朋友。這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的,關聯可以是單向、雙向的。表現在代碼層面,為被關聯類B以類屬性的形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量。

      在UML類圖中,用實線連接配接有關聯的對象所對應的類,在使用Java、C#和C++等程式設計語言實作關聯關系時,通常将一個類的對象作為另一個類的屬性。

      1.雙向關聯。

      預設情況下,關聯是雙向的,雙向的關聯可以有兩個箭頭或者沒有箭頭。

      2.單向關聯。

      類的關聯關系也可以是單向的,單向關聯用帶箭頭的實線表示。

      單向關聯和雙向關聯的UML示例圖如下所示::

設計模式中類的關系之關聯關系(Association)

      【說明】:上圖中,Teacher與Student是雙向關聯,Teacher有多名Student,Student也可能有多名Teacher(兩個類連線下面的*表示多對多的關系)。但Student與Course間的關系為單向關聯,一名Student可能有多門Course,課程是個抽象的東西,是以不擁有Course。

      單向關聯和雙向關聯的示例代碼如下(Teacher、Student類的定義):

  Teacher.h檔案:

1 @class Student;
2 @interface Teacher : NSObject
3 {
4     Student     *_student;
5 }
6 
7 @property (nonatomic, retain) Student *student;
8 
9 @end      

      Student.h檔案:

1 #import "Course.h"
 2 
 3 @class Teacher;
 4 @interface Student : NSObject
 5 {
 6     Teacher     *_teacher;
 7     Course      *_course;
 8 }
 9 
10 @property (nonatomic, retain) Teacher *teacher;
11 @property (nonatomic, retain) Course *course;
12 
13 @end      

      【注意】:可能大家注意到了,在Student類的定義中,包含Course類用的是:#import "Course.h";而包含Teacher類用的是:@class Teacher;。這是因為Teacher類和Student是雙向關聯,如果直接用import,那麼在編譯的時候,編譯器會報錯,至于@class和#import的差別,在後面會進行介紹。

      3.自關聯。

      在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯。比如我們在資料結構中描述樹結構,會建一個節點Node類,Node類有一個指針父節點也是Node類型。

      源碼下載下傳   傳回目錄

循自然之道,撫浮躁之心