轉載
面向對象設計 對象間關系:依賴、關聯、聚合和組合,四種關系容易混淆。特別后三種,只是在語義上有所區別,所謂語義就是指上下文環境、特定情景等。
1、依賴(Dependency)
依賴關系,是類與類之間的聯接。依賴關系表示一個類依賴於另一個類的定義。使用關系。一般情況下,依賴關系在Java語言中體現為局域變量、方法的形參,或者對靜態方法的調用。 示例代碼如下:
package com.liuxd.relation; /** * Created by Liuxd on 2018/9/11. */ public class DependencyTest { /** * 菜刀 */ static class Kinfe { public static void cutting(String name) { System.out.println("切" + name); } } /** * 廚師 */ class Chef { public void cutting(Kinfe kinfe, String vegetables) { kinfe.cutting(vegetables); } } public static void main(String[] args) { DependencyTest dependencyTest = new DependencyTest(); Chef chef = dependencyTest.new Chef(); Kinfe kinfe = new Kinfe(); chef.cutting(kinfe,"carrot"); } }
2、關聯(Association)
關聯關系,是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。擁有關系。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關系一般使用成員變量來實現。
package com.liuxd.relation; /** * Created by Liuxd on 2018/9/11. */ public class AssociationTest { /** * 菜刀 */ static class Kinfe { public static void cutting(String name) { System.out.println("切" + name); } } /** * 廚師 */ class Chef { private Kinfe kinfe; public Chef(Kinfe kinfe){ this.kinfe=kinfe; } public void cutting(Kinfe kinfe, String vegetables) { kinfe.cutting(vegetables); } } public static void main(String[] args) { AssociationTest dependencyTest = new AssociationTest(); Kinfe kinfe = new Kinfe(); Chef chef = dependencyTest.new Chef(kinfe); chef.cutting(kinfe,"carrot"); } }
3、聚合(Aggregation)
聚合關系,是關聯關系的一種,是強的關聯關系。聚合是整體和個體之間的關系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關系便整體和個體的關系。與關聯關系一樣,聚合關系也是通過實例變量實現的。但是關聯關系所涉及的兩個類是處在同一層次上的,而在聚合關系中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分。
// 汽車 class Car{ // 汽車可以有發動機, 但是不確定什么時候賦予 private Enginemy engine; } // 發動機 class Engine{ }
4、組合(Composition)
組合關系,是關聯關系的一種,是比聚合關系強的關系。它要求普通的聚合關系中代表整體的對象負責代表部分對象的生命周期,組合關系是不能共享的。代表整體的對象需要負責保持部分對象和存活,在一些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由后者負責此對象的生命周期。換言之,代表部分的對象在每一個時刻只能與一個對象發生組合關系,由后者排他地負責生命周期。部分和整體的生命周期一樣。
package com.liuxd.relation; /** * Created by Liuxd on 2018/9/11. */ public class CompositionTest { /** * 菜刀 */ static class Kinfe { public static void cutting(String name) { System.out.println("切" + name); } } /** * 廚師 */ class Chef { Kinfe kinfe = new Kinfe(); public void cutting(String vegetables) { kinfe.cutting(vegetables); } } public static void main(String[] args) { CompositionTest dependencyTest = new CompositionTest(); Chef chef = dependencyTest.new Chef(); chef.cutting("carrot"); } }
————————————————
版權聲明:本文為CSDN博主「春風化作秋雨」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiahao1186/article/details/82634723