1. 程式人生 > >關聯關係和依賴關係

關聯關係和依賴關係

1、  關聯關係

類A關聯類B的意思是,如果例項化一個A類的物件,同時,會有一個B類的物件被例項化。簡言之,B作為A的屬性存在。如下:

  1. class A{  
  2.        private B b;  
  3. }  
  4. class B{  
  5. }  

2、  依賴關係

類A依賴類B的意思是,如果A的物件要完成某一操作,必須使用B的物件的某些操作來幫忙,才能完成。簡言之,B作為A的某個方法的方法引數存在。如下:

  1. class A{  
  2.        publicvoid f(B b){  
  3. }  
  4. }  
  5. class B{  
  6. }  

關聯和依賴,是面向物件程式設計中,最常見的兩種關係。

3、示例

假設有這樣一個場景描述:某培訓中心提供免費培訓課程,每門課程都有其名字以及原價。學員最多每人可以選擇一門課程,學員只要登記姓名,就可以選擇一門課程來學習。

       通過分析這個簡單場景,可以很容易分析出,有兩種物件:學員,課程。也就是說,我們應該建立兩個類,Student,    Course。

       Course類有兩個屬性,課程名稱和原始價格。如下:

  1. publicclass Course {  
  2.        private String title;  
  3.        privatedouble price;  
  4.        public Course(String title, 
    double price) {  
  5.               super();  
  6.               this.title = title;  
  7.               this.price = price;  
  8.        }  
  9.        public Course(String title) {  
  10.               super();  
  11.               this.title = title;  
  12.        }  
  13.        public Course() {  
  14.               super();  
  15.        }  
  16.        public
     String getTitle() {  
  17.               return title;  
  18.        }  
  19.        publicvoid setTitle(String title) {  
  20.               this.title = title;  
  21.        }  
  22.        publicdouble getPrice() {  
  23.               return price;  
  24.        }  
  25.        publicvoid setPrice(double price) {  
  26.               this.price = price;  
  27.        }  
  28. }  

然後建立另外一個類,Student,該類有一個學員姓名屬性name,另外,因為每個學員可以選擇一門課程學習,那麼就是說,每個Student物件,會有一個Course物件,即Course應該作為Student的一個屬性存在,即Student關聯Course。那麼,會有如下宣告:
  1. publicclass Student {  
  2.     private String name;  
  3.     //1.關聯關係:Student關聯Course
  4.     private Course course;  
  5.     public Student(String name) {  
  6.        super();  
  7.        this.name = name;  
  8.     }  
  9. }  
繼續分析,Student應該有1個行為,就是選擇課程。要完成選擇課程這個操作,必須得接受一個課程的物件,也就是說,Student選課這個行為,必須依賴於Course的一個物件,才能完成,所以StudentCourse之間還存在依賴關係,繼續完善上邊程式碼:
  1. publicclass Student {  
  2.        private String name;  
  3.        //1.關聯關係:Student關聯Course
  4.        private Course course;  
  5.        public Student(String name) {  
  6.               super();  
  7.               this.name = name;  
  8.        }  
  9.        //2.依賴關係:Student依賴Course
  10.        publicvoid chooseCourse(Course course){  
  11.               this.course=course;  
  12.        }  
  13.        public Course getCourse(){  
  14.               returnthis.course;  
  15.        }  
  16. }  

很多初學者,對於Course作為Student的一個屬性,以及Course型別作為方法引數,作為方法返回值的型別,不能接受。總覺得只有String,int之類才是資料型別,而Course作為一個型別存在,有些不倫不類。Java是面向物件的語言,任何一個類,就是一個型別,都可以作為資料型別存在,我們自己宣告的類也不例外。也就是說,如果能理解String作為一個型別存在,就應該坦然接受Course作為一個型別存在,因為它們是一樣的,都是一個型別而已,只不過String是API中宣告的,Course是我們自己宣告的。

       學習本文內容後,初學者應該又上了一個臺階,就是不再僅僅關注某個Java類的語法,而是從更高的角度去看待Java應用,去關注類與類的關係。

總結一下關聯和依賴關係:

1、  關聯和依賴都是面向物件程式設計中,常用的關係。

2、  關聯表示has-a關係,如學生擁有一個課程,往往表現為B作為A的屬性存在(A關聯B)

3、  依賴表示要做一件事情,離不開某個物件。往往表現為B作為A的方法引數存在(A依賴B)

4、  當開始瞭解類與類的關係後,就需要對型別有更深入的瞭解。切記,任何類都可以作為型別使用。

在本文例子中,學生只能選擇一門免費課程學習,如果培訓中心加大優惠力度,每個學生最多可以選擇3門課程學習,應該如何維護這種關係哪?我們就不得不去了解Java語言中的一些“資料容器”物件:陣列、集合。