2011-07-12 55 views
1

聚合是一個整體/部分關係。如果全不存在不再,但部分將仍然存在類定義中的聚合和組合表示?

但在組成上如果全不存在不再,但部分將不復存在

例如,一所大學擁有各部門(如化學),每個部門都有一批教授。如果大學關閉,部門將不復存在,但這些部門的教授將繼續存在。因此,大學可以被看作是一個部門的組成部分,而部門則由教授組成。

我的問題在這裏我們將如何實際定義java中的大學,系和教授的類定義,它也描述了聚合和組合行爲?

回答

4

構圖和聚合的概念用UML中的菱形箭頭顯示,但是當這些概念以編程語言實現時,可能會從一種編程語言更改爲另一種編程語言。

一般來說,在Java,C#或Delphi等編程語言中,兩種情況都由對象引用表示。每個對象都有一個「生命週期」(「創建」,「做東西」,「銷燬」)。

package Universities; 

class ProfessorClass { 
    string FirstName; 
    string LastName; 

    // constructor 
    public ProfessorClass(string AFirstName, string ALastName) { 
    FirstName = AFirstName; 
    LastName = ALastName; 
    } 
} // class ProfessorClass 

class DepartmentClass { 
    string Name; 
    string Description; 

    // constructor 
    public DepartmentClass(string AName, string ADescription) { 
    Name = AName; 
    Description = ADescription; 
    } 
} // class DepartmentClass 

class UniversityClass { 
    // here doesn't look different: 

    // aggregation 
    ProfessorClass[] Professors; 
    // composition 
    DepartmentsClass[] Departments; 

    // constructor 
    public UniversityClass() { 
    // "UniversityClass" is in charge of creating parts 

    // here doesn't look different: 

    DepartmentsClass = new DepartmentsClass[](); 

    ProfessorClass = new ProfessorClass[](); 
    } 

    public addDepartment(string AName, string ADescription) 
    { 
    // composition, whole class is in charge of adding parts: 
    DepartmentClass Dept = new DepartmentClass(AName, ADescription); 
    DepartmentsClass.add(Dept); 
    } 

    public deleteDepartment(string AName) 
    { 
    // composition, whole class is in charge of deleting parts: 
    DepartmentsClass.delete(AName); 
    } 

    public addProfessor(ProfessorClass AProfessor) 
    { 
    // aggregation, whole class only reference other objects, 
    // but, may look like they where parts 
    ProfessorClass.add(AProfessor); 
    } 

    public static void main(String[] args) { 
    UniversityClass MyUniversity = new UniversityClass(); 

    // composition, internal, maintained by main class 
    MyUniversity.addDepartment("History", "Very Boring"); 
    MyUniversity.addDepartment("Music", "Only if you like it"); 
    MyUniversity.addDepartment("Astronomy", "night living people"); 

    // aggregation, external, referenced by main class, 
    // maintained independently 
    ProfessorClass Professor1 = new ProfessorClass("Jane", "Doe"); 
    ProfessorClass Professor2 = new ProfessorClass("Mike", "Smith"); 
    ProfessorClass Professor3 = new ProfessorClass("Louise", "Kent"); 

    MyUniversity.addProfessor(Professor1); 
    MyUniversity.addProfessor(Professor2); 
    MyUniversity.addProfessor(Professor3); 
    } // static void main(...) 

} // class UniversityClass 

在組合物中,由其它的對象組成的「整體」的對象(「份」),是負責創建,使用&破壞其部件。 「整體」對象負責其每個「部分」的「生命週期」。

在聚合中,引用其他對象(「聚合」)的「整體」對象通常可能看起來類似於「部件」(組合),而不是由剛剛分配或取消分配的主對象創建或銷燬。主對象不直接控制其他對象,只需添加或刪除引用。

有時你可能會從其他開發者那裏挑選代碼,並且可能會看到兩個想法,混淆,並且不能區分使用了哪個概念。

+0

嗨Umlcat我正在尋找java中的這些對象的類定義有更好的理解。 –

+0

@Mohit Gupta完成,它有一個很大的例子,需要時間來編寫代碼,它不能完全運行,只是一個近似的例子 – umlcat

+0

感謝umlcat。但是我對上面的例子還有一個問題,那就是聚合和關聯之間有什麼區別?看起來我們可以說大學與教授有聯繫,我們也可以說大學是教授的聚合。哪一個是對的? –

0

讓我們來設置條款。聚合是UML標準中的一個元語言,並且意味着BOTH構成和共享聚合,簡稱爲共享。通常它被錯誤地命名爲「聚合」。它是壞的,因爲構圖也是一個聚合。據我所知,你的意思是「共享」。

此外從UML標準:

複合 - 指示該屬性被聚集複合地, 即,複合物具有用於存在和 存儲所構成的對象(零件)的責任。

所以,大學cathedras關聯是一種組合物,因爲cathedra的不存在出來大學(IMHO)的

共享聚合的精確語義因應用領域和 建模而變化。

即所有其它協會可以得出共享聚合,如果你只以下到你的或別人的一些原則。也看here