面向對象中的耦合概念詳解
在面向對象的程序設計中,引導我們的基本思想就是:“一切皆對象”。那麽我們可以把對象與對象的關系總體分為四類。分別是:依賴、關聯、聚合和組合。首先我們先看一下 書上的定義:
- 依賴(Dependency)關系是類與類之間的聯接。依賴關系表示一個類依賴於另一個類的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類依賴於Car類和House類的定義,因為Person類引用了Car和House。與關聯不同的是,Person類裏並沒有Car和House類型的屬性,Car和House的實例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關系在Java語言中體現為局域變量、方法的形參,或者對靜態方法的調用。
- 關聯(Association)關系是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關系一般使用成員變量來實現。
- 聚合(Aggregation) 關系是關聯關系的一種,是強的關聯關系。聚合是整體和個體之間的關系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關系便整體和個體的關系。與關聯關系一樣,聚合關系也是通過實例變量實現的。但是關聯關系所涉及的兩個類是處在同一層次上的,而在聚合關系中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分。
- 組合(Composition) 關系是關聯關系的一種,是比聚合關系強的關系。它要求普通的聚合關系中代表整體的對象負責代表部分對象的生命周期,組合關系是不能共享的。
——摘自《Java面向對象編程》
1.依賴:
可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、、臨時性的、非常弱的,但是B類的變化會影響到A;
class A{
public void fun_A(){
........
}
}
class B{
//使用參數方式發生與A的依賴關系
public void fun(A a){
a.fun_A();
}
//使用創建對象的方式與A發生依賴關系
public void fun(){
A a = new A();
a.fun_A();
}
}
2.關聯
關聯是一種“擁有”的關系。表現在代碼上,就是一個類包含另一個類的實例,通常表現為被關聯類以類屬性的形式出現在關聯類的類定義中,也可以表現為關聯類引用了一個類型為被關聯類的全局變量。關聯可以使單向的,也可以使雙向的。依賴和關聯的區別在於依賴是使用,關聯是擁有.
class A{ public void fun_A(){ ............ } } class Person{ private A a ; public Person(A a){ this.a = a ; } public void work(){ a.fun_A() ; }
}
3.聚合
聚合是關聯關系的一種,它是一種強關聯關系(has-a);聚合關系是整體和個體/部分之間的關系;關聯關系的兩個類處於同一個層次上,而聚合關系的兩個類處於不同的層次上,一個是整體,一個是個體/部分;在聚合關系中,代表個體/部分的對象有可能會被多個代表整體的對象所共享;表現在代碼層面上就是在構造器初始化時將兩個類關聯起來。代碼如下:
class A{ } class B{ private A a ; //與上面關聯的代碼不同之處在於構造B時必須同時構造B,也就是說B是A的不可缺少的一部分 public B(A a){ this.a = a ; } }
4.組合
組合也是關聯關系的一種(is-a),但它是比聚合關系更強的關系.組合關系要求聚合關系中代表整體的對象要負責代表個體/部分的對象的整個生命周期;組合關系不能共享;在組合關系中,如果代表整體的對象被銷毀或破壞,那麽代表個體/部分的對象也一定會被銷毀或破壞,而聚在合關系中,代表個體/部分的對象則有可能被多個代表整體的對象所共享,而不一定會隨著某個代表整體的對象被銷毀或破壞而被銷毀或破壞;
class A{ ........... } class B{ private A a; public B(){ a = new A() ; } }
總結:
聚合和組合的區別:聚合是個體離開了整體,依然可以存在.
組合是個體和整體不可以分開,個體不能離開整體單獨存在.
依賴,關聯 和聚合,組合的區別:依賴,關聯 : 類之間的關系是在同一層次上.
聚合,組合: 類之間的關系表現為整體和部分.
面向對象中的耦合概念詳解