[英]How to draw a UML diagram when class A has aggregation and composition relationship with class B?
[英]composition relationship in class diagram can have cycles?
我想為Java類圖實現模型檢查器。
我已經考慮了很多限制了一段時間。
希望任何人都能幫助我解決。
我這里所說的所有循環都是純循環,只有一種類型的關系。
問題1:假設A類由B類組成,並且A類和B類是不同的類,那么B類是否也可能由A類組成嗎? 此外,構圖關系是否可能具有周期?
問題2:關於類圖中的其他關系,例如聚合,依賴關系和關聯,該怎么辦? 這些關系中的循環是什么意思? 誰能舉一些例子?
感謝您閱讀我的問題,希望有人能幫助我。
問題1:假設A類由B類組成,並且A類和B類是不同的類,那么B類是否也可能由A類組成嗎? 此外,構圖關系是否可能具有周期?
嚴格說來是UML術語...是的,但是很難在代碼中實際實現。 如果你問自己:“如果沒有A,B可以獨自站立嗎?” 和“ A可以沒有B獨立嗎?” 如果您不能同時對這兩個答案都回答“否”,那么您可以使兩個類相互組成。 因為一個人必須能夠獨立站立,而另一個人才能由它組成,所以您不能同時擁有兩者。 但是,由於組合與聚合主要基於設計和上下文,因此並非完全不可能。 例如,您可以具有以下內容:
類B
包含對A
的引用,而A
包含對B
的引用
public class A {
B myB;
String name = "A";
public A(int num) {
this.name += num;
}
public void setMyB(B b) {
this.myB = b;
}
public B getMyB() {
return this.myB;
}
public String getName() {
return this.name;
}
}
public class B {
A myA;
String name = "B";
public B(int num) {
this.name += num;
myA = new A(num);
}
public A getMyA() {
return this.myA;
}
public String getName() {
return this.name;
}
}
在此示例中,我們使用定義的String
提供類的標識符,然后在其后附加一個數字,以顯示一些唯一的ID。 我們提供了允許我們訪問A
和B
引用的方法,但是只有B
通過構造函數(組成)創建對另一個的引用。
使用這個簡單的測試:
public class Test {
public static void main(String[] args) {
A myA = new A(1);
B myB = new B(2);
B anotherB = new B(3);
myA.setMyB(anotherB);
System.out.println("A = " + myA.getName());
System.out.println("A's B = " + myA.getMyB().getName());
System.out.println("B = " + myB.getName());
System.out.println("B'a A = " + myB.getMyA().getName());
}
}
我們可以看到以下輸出
A = A1
A's B = B3
B = B2
B'a A = A2
在這個例子中,在B基准A
被的上下文之外創建A
並通過在作為參數。 如果刪除myB
,則將丟失對其A
的引用,但如果刪除myA
,則不會myA
(我們仍然還有anotherB
。
假設我們從A
消除了setMyB()
方法,並將其移到構造函數中……我們將有一個無限循環的新對象,而您最終會遇到一個StackOverflowError
您可能會很有創造力,並嘗試實現Singleton模式或其他限制創建對象數量的構造,但這樣做將意味着構造函數將需要為私有/隱藏的,這將阻止其他類的擴展。 使用靜態字段來跟蹤創建的數量可能會避免該錯誤,但是隨后您將丟失所有引用,而又沒有一個地方來跟蹤所有引用,最后,您將永遠不會擁有“完美”的組合,因為一類將丟失其組成部分。
經過所有這些“分析”,您最終會得出一種有意義的設計,而不是嚴格符合UML圖上繪制的設計。 UML圖在那里傳達了類之間的“關系”。 您在此處詢問的“獨特”案例可能不會用UML建模解決A在哪里使用B和B在哪里使用A,但是可能需要其他一些設計工作。
問題2:關於類圖中的其他關系,例如聚合,依賴關系和關聯,該怎么辦? 這些關系中的循環是什么意思? 誰能舉一些例子?
關聯關系實際上用於描述由組成,聚合,多對多,一對一等定義的並且取決於上下文的關系類型。 每個關聯中循環的含義將取決於您的設計。
通常,依賴項中的循環意味着類依賴於自身。 這可能用於遞歸函數調用,Singleton設計模式實現或某些其他需要類引用自身的設計模式。
上面已經回答了聚合問題。 從根本上講,它意味着對象“使用”了所有正在聚合的對象。 一個示例是Company
聚合People
。 當公司消失時,人們仍然存在。 這種關系的循環類似於我的示例中所示的循環,不同之處在於,您具有對A
和B
類的外部引用,並將它們作為參數傳遞給對A
和B
的前兩個引用。
最重要的是... UML是顯示類之間關系的工具。 設計和實現將隨之而來,而您擁有使用UML建模的“有趣”關系這一事實並不會幫助您克服嚴重的設計障礙。
希望這有助於闡明您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.