標籤:style blog http color java 使用 os io
在物件導向方法中,我們在確定了類及類的屬性和方法後,不可避免的要研究類和類之間的關係,正是這些關係將整個事情串聯起來,使彼此之間有了聯絡,就像現實生活中,人與人交往中存在著不同的關係。瞭解這些關係,對於我們開發系統百利而無一害,可以讓我們輕鬆、高效的工作,同樣像我們在日常生活中處理好人與人之間的關係,會給我們帶來巨大的好處。那麼我們就來認識一下,物件導向中類與類之間有那些關係。
類和類之間的關係大概可以分為一下幾種類型:泛化關係(Generalization)、實現關係(realization)、依賴關係(Dependency)、關聯關係(Association)(關聯、彙總(Aggregation)、組合(Composition))。泛化關係和實現關係體現的是一種類和類、或者類和介面間的關係,不存在引用,歸結為縱向關係;依賴關係和關聯關係體現的是類和類、類與介面間的引用,歸結為橫向關係。
一、泛化關係
泛化關係是一個類(子類、子介面)繼承另外的一個類(父類、父介面)的功能,並且可以有自己的新功能,也既是我們所說的繼承關係。在java中通過extends來標識。在UML中用一條帶空心箭頭的實現表示,從子類指向父類,或者子介面指向父介面。
代碼如下: Class _A{} Class _B extends _A{} Public class Test{ Public static void main(String args[]){ _A a = new _B(); } }
二、實現關係
實現關係指的是class類實現interface介面(可以使多個介面)。在java中用implements標識,在UML中用一條帶空心三角箭頭的虛線標識,從類指向實現的介面。
代碼如下:Interface A{}Class B implements A{}Public class Test{ Public static void main( String args[] ){ B b = new B(); } }
說明:以上泛化和實現為一對,兩者都用空心三角形,繼承關係比實現介面關係耦合性強, 所以繼承用實線,實現介面用虛線
三、依賴關係
依賴關係是類與類之間的串連. 表示一個類依賴於另一個類的定義. 依賴關係總是單向的 。依賴是類的五種關係中耦合最小的一種關係。因為依賴關係在產生代碼的時候,這兩個關係類都不會增加屬性。這種微弱的關係可以用類之間的相互瞭解的程度來說明。在java 中. 依賴關係體現為: 局部變數, 方法中的參數, 和對靜態方法的調用.。在UML中,依賴關係用由類A指向類B的帶箭頭虛線表示。
代碼如下所示:
Class A{ }Class B{ }
依賴關係表現形式一:
A類是B類的某個方法中的變數,則B類可以調用它,代碼如下:
Class B{ Public void info(){ Private A a; }}
註:B有一個info方法,A類作為該方法的變數來使用。A類的生命期,它是當B類的info方法被調用的時候,才被執行個體化。
依賴關係表現形式二:
A類是作為B類中某個方法的參數或者返回值時,代碼如下:
Class B { Public A info( A a){ Return null; }}
依賴關係表現形式三:
A類中有一個是靜態方法,B類可以調用它
無用多說,A類被B類的一個方法持有。生命期隨著方法的執行結束而結束。
四、關聯關係
關聯體現的是兩個類之間語義層級的一種強依賴關係,這種關係比依賴更強、不存在依賴關係的偶然性、關係也不是臨時性的,一般是長期性的,它使一個類知道另一個類的屬性和方法,而且雙方的關係一般是平等的。關聯可以是單向、雙向的。在java 語言中關聯關係是使用執行個體變數實現的。在UML中,關聯關係用由關聯類別A指向被關聯類別B的帶箭頭實線表示,在關聯的兩端可以標註關聯雙方的角色和多重性標記。
單向關聯如下:
Class A { }Class B { Public A a; }
雙向關聯如下:
Class A { Public B b; }Class B { Public A a; }
說明:依賴和關聯的區別:
①從類的屬性是否增加的角度看:
發生依賴關係的兩個類都不會增加屬性。其中的一個類作為另一個類的方法的參數或者返回值,或者是某個方法的變數而已。
發生關聯關係的兩個類,其中的一個類成為另一個類的屬性,而屬性是一種更為緊密的耦合,更為長久的持有關係。
②從關係的生命期角度看:
依賴關係是僅當類的方法被調用時而產生,伴隨著方法的結束而結束了。
關聯關係是當類執行個體化的時候即產生,當類銷毀的時候,關係結束。相比依賴講,關聯關係的生存期更長。
因為,關聯關係比依賴關係耦合性強,所以,關聯關係用實線,依賴關係用虛線。
關聯關係經過細化,還存在兩種特例:彙總和組合。
(1)彙總關係:是整體和個體之間的關係,即has-a的關係,此時整體與部分之間是可分離的,他們可以具有各自的生命週期,部分可以屬於多個整體對象,也可以為多個整體對象共用;表現在代碼層面,和關聯關係是一致的,只能從語義層級來區分。從java 文法上是分不出關聯和彙總的。在UML中,彙總關係以空心菱形加實線箭頭表示。
代碼如下:
Class B { }Class A{ Public B b; A (B b){ This.b = b; }}
注意:關聯關係中兩個類是處於相同的層次, 而彙總關係中兩不類是處於不平等的層次, 一個表示整體, 一個表示部分。
(2)組合關係: 體現的是一種contains-a的關係,這種關係比彙總更強,也稱為強彙總;他同樣體現整體與部分間的關係,但此時整體與部分是不可分的,整體的生命週期結束也就意味著部分的生命週期結束;比如你和你的大腦;合成關係不能共用. 。表現在代碼層面,和關聯關係是一致的,只能從語義層級來區分。在UML中,組合關係以實心菱形加實線箭頭表示。
代碼如下:
Class B { }Class A{ Public B b; A (){ b = new Wings(); }}
注意:這兩種關係的區別在於
①建構函式不同
彙總類的建構函式中包含了另一個類作為參數。A的建構函式中要用到B作為參數傳遞進來。A可以脫離雁群類而獨立存在。
組合類別的建構函式中包含了另一個類的執行個體化。表明A在執行個體化之前,一定要先執行個體化B,這兩個類緊密的耦合在一起,同生共滅。B類是不可以脫離A類而獨立存在
②資訊的封裝性不同
在彙總關係中,用戶端可以同時瞭解A類和B類,因為他們都是獨立的
而在組合關係中,用戶端只認識A類,根本就不知道B類的存在,因為B類被嚴密的封裝在A中。
③生命週期不同:
彙總是整體與部分之間是可分離的,他們可以具有各自的生命週期,不會因為一方的消失另一方跟著消失。
彙總是整體與部分是不可分的,整體的生命週期結束也就意味著部分的生命週期結束。