2014-12-04 62 views
0

我想了解聚合和組合。
假設我有類似如下:
enter image description here使用類圖在java中的聚合和組合實現

,我想用java它來實現,是實現以下正確的?

public class ClassC { private String z; } 

public class ClassB { 
    private String y; 
    private ClassC classC; 
    //-----setter and getter for classC 
} 


public class ClassA { 
    private String x; 
    private List<ClassB> classBList; 
    public ClassA(final List<ClassB> classBList) { 
     this.classBList=classBList 
    } 
} 

另外,如何確保ClassB只能有1個ClassC?
和ClassA可以有一個或多個ClassB?如箭頭所示(如果我正確理解這些符號)。

+0

http://stackoverflow.com/questions/11881552/implementation-difference-between-aggregation-and-composition-in-java – mihaisimi 2014-12-04 17:44:40

+0

嗨mihaisimi!我也瀏覽了這個鏈接,但是我已經正確理解了它,是否是從類圖實現它的正確方法之上的示例? – iAmLearning 2014-12-04 18:02:22

+0

我理解聚合和組合的基礎知識和區別,但是從上面的類圖和數字的實現爲箭頭放置的時候它會是0或1有點困惑 – iAmLearning 2014-12-04 18:06:00

回答

1

我認爲可能會令人困惑的是組成和聚合之間的差異,因爲兩者都是「有」關係的樣本。 但是,合成比聚合更強大,包含的對象控制着零件對象的整個生命週期。

你可以像你一樣,但它並不完全切中要害與最後寫:

public class ClassA { 
    private String x; 
    private final List<ClassB> classBList; 
    public ClassA(String x, List<ClassB> classBList) { 
     this.classBList=classBList; 
     this.x = x; 
    } 
} 

我認爲這將使一個更清晰的表示:

public class ClassA{ 
    private String x; 
    private final List<ClassB> classBList; 
    public ClassA(String x){ 
     this.x = x; 
     classBList = new ArrayList<ClassB>(2); 
     classBList.add(new ClassB(..........)); 
     classBList.add(new ClassB(..........)); 
    } 

} 
0

您可以推估就這樣,用你的類圖作爲例子。對於ClassA,像mihaisimi那樣做:在ClassA的構造函數中實例化一個ClassB的列表。如果要確切確定有多少個ClassB實例應該是給定ClassA實例的一部分,只需向構造函數中添加一個整型參數,並在它爲0時拋出一個異常。然後使用傳遞的值作爲循環計數器用於Add方法。

對於ClassB,將一個參數添加到類型爲ClassC的構造函數中。所以,這樣的事情(Java的有點生疏,所以根據需要隨時糾正我的語法):

public class ClassA 
{ 
    public final List<ClassB> classBList; 
    public ClassA(int y){ 
     this.myClassBList = x; 
     classBList = new ArrayList<ClassB>(y); 
     for(int i=0;i<y;i++) 
     { 
      classBList.add(new ClassB(new ClassC)); 
     } 
} 

public class ClassB 
{ 
    public ClassC myClassCInstance; 
    public ClassB(ClassC myClassC) 
    { 
     myClassCInstance = myClassC; 
    } 
} 

正如你所看到的,這可以讓你有任何數量與ClassA的實例相關聯的ClassB的實例,並按照組合要求將其生命與ClassA聯繫起來。另外,正如您所看到的,您不能將多個ClassC實例添加到ClassB的任何實例,並且ClassB的生命週期不會嚴格與ClassB綁定。

因此,如何模擬構圖和構造的基本區別在於:對於構圖,在構圖對象(帶菱形構造的構件)中實例化組合對象,併爲了聚合,將聚合對象傳遞到聚合對象的構造函數作爲參數。

0

有許多正確的方法來實現這樣的類圖。

但是爲了選擇正確的實現,您應該首先確保您理解UML中定義的關聯,聚合和合成的概念。

我寫有關我網站上的一篇文章:UML Composition vs Aggregation vs Association

總之,該組合物是真正的約束和對發展的影響關聯的類型,而聚合是純粹的功能指示該協會的性質沒有技術影響。