聚合是一种特殊的关联形式。
它是两个类之间的关系,如关联,但它是一个方向关联,这意味着它严格地是单向关联。
它代表了一种HAS-A关系。


Java中的聚合示例

例如,考虑两个类Studentclass和Addressclass。
每个学生都有一个地址,所以学生和地址之间的关系是一个Has-A关系。
但是如果你认为它的反之亦然,那就没有任何意义,因为Address它不需要有Student必要。
让我们在java程序中编写这个例子:

class Address
{
    int streetNum;
    String city;
    String state;
    String country;
    Address(int street, String c, String st, String coun)
    {
        this.streetNum=street;
        this.city =c;
        this.state = st;
        this.country = coun;
    }
}
class StudentClass
{
    int rollNum;
    String studentName;
    //和Address类创建一个 HAS-A 关系 
    Address studentAddr;
    StudentClass(int roll, String name, Address addr){
        this.rollNum=roll;
        this.studentName=name;
        this.studentAddr = addr;
    }
    public static void main(String args[]){
        Address ad = new Address(55, "Agra", "UP", "India");
        StudentClass obj = new StudentClass(123, "Chaitanya", ad);
        System.out.println(obj.rollNum);
        System.out.println(obj.studentName);
        System.out.println(obj.studentAddr.streetNum);
        System.out.println(obj.studentAddr.city);
        System.out.println(obj.studentAddr.state);
        System.out.println(obj.studentAddr.country);
    }
}

程序输出:

        123
        Chaitanya
        55
        Agra
        UP
        India

上面的示例显示了Student和Address类之间的聚合。
您可以看到在Student类中我已经声明了Address类型的属性来获取学生地址。
它是Java中聚合的典型示例。


为什么我们需要聚合?

维护代码的可重用性。
要理解这一点,再次使用相同的示例。
假设还有另外两个类College,Staff以及上面两个类Student和Address。
为了保持Student的地址,College地址和Staff的地址,我们不需要一次又一次地使用相同的代码。
我们只需要在定义每个类时使用Address类的引用,如:

Student Has-A Address (Has-a relationship between student and address)
College Has-A Address (Has-a relationship between college and address)
Staff Has-A Address (Has-a relationship between staff and address)

因此,我们可以通过使用聚合关系来提高代码的可重用性。


所以,如果我必须在代码中写这个,我会这样做:

class Address
{
    int streetNum;
    String city;
    String state;
    String country;
    Address(int street, String c, String st, String coun)
    {
        this.streetNum=street;
        this.city =c;
        this.state = st;
        this.country = coun;
    }
}
class StudentClass
{
    int rollNum;
    String studentName;
    //Creating HAS-A relationship with Address class
    Address studentAddr;
    StudentClass(int roll, String name, Address addr){
        this.rollNum=roll;
        this.studentName=name;
        this.studentAddr = addr;
    }
    ...
}
class College
{
    String collegeName;
    //Creating HAS-A relationship with Address class
    Address collegeAddr;
    College(String name, Address addr){
        this.collegeName = name;
        this.collegeAddr = addr;
    }
    ...
}
class Staff
{
    String employeeName;
    //Creating HAS-A relationship with Address class
    Address employeeAddr;
    Staff(String name, Address addr){
        this.employeeName = name;
        this.employeeAddr = addr;
    }
    ...
}

正如您所看到的,我们没有在三个类中的任何一个中编写Address代码,我们只是使用Address类创建了HAS-A关系以使用Address代码。
上面代码中的点点(…)部分可以用public static void main方法替换,与第一个例子中看到的类似。


原文地址:

https://beginnersbook/2013/05/aggregation/

更多推荐

Java教程17—Java中的聚合关系