65.9K
CodeProject 正在变化。 阅读更多。
Home

面向对象编程中理解关联、聚合和组合

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2024年8月30日

CPOL

2分钟阅读

viewsIcon

1762

在面向对象编程 (OOP) 中,理解类之间的关系对于设计健壮且易于维护的系统至关重要。三种基本的关系类型是关联、聚合和组合。

1. 什么是关联?

关联表示一种类中的对象与另一种类中的对象相链接的关系。这种关系可以是点对点、一对多或多对多。关联是最通用的关系形式,并不意味着对象之间存在所有权或生命周期依赖关系。

1.1 点对点关联

在点对点关联中,一个类中的每个对象都与另一个类中的精确一个对象关联。例如,Person 类和 Passport 类,每个人都恰好有一个护照。
Image
public class Person {
    private Passport passport;

    public Person(Passport passport) {
        this.passport = passport;
    }

    public Passport getPassport() {
        return passport;
    }
}

public class Passport {
    private String number;

    public Passport(String number) {
        this.number = number;
    }

    public String getNumber() {
        return number;
    }
}
演示
public class Main {
    public static void main(String[] args) {
        Passport passport = new Passport("123456789");
        Person person = new Person(passport);
        
        System.out.println("Passport Number: " + person.getPassport().getNumber());
    }
}
结果
Passport Number: 123456789

1.2 一对多关联

在一对多关联中,一个类中的对象与另一个类中的多个对象关联。例如,Teacher 类和 Student 类,一位老师可以有多个学生。
Image
示例
import java.util.ArrayList;
import java.util.List;

public class Teacher {
    private List<Student> students = new ArrayList<>();

    public void addStudent(Student student) {
        students.add(student);
    }

    public List<Student> getStudents() {
        return students;
    }
}

public class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
演示
public class Main {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.addStudent(new Student("John"));
        teacher.addStudent(new Student("Jane"));

        for (Student student : teacher.getStudents()) {
            System.out.println("Student Name: " + student.getName());
        }
    }
}
结果
Student Name: John
Student Name: Jane

2. 什么是聚合?

聚合是关联的一种特殊形式,具有整体-部分关系,其中子对象可以独立于父对象存在。这表示比组合更弱的关系,意味着子对象的生命周期不依赖于父对象。

2.1 聚合示例

考虑 LibraryBook 类。图书馆可以有多个图书,但图书可以独立于图书馆存在。
示例
import java.util.ArrayList;
import java.util.List;

public class Library {
    private List<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    public List<Book> getBooks() {
        return books;
    }
}

public class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}
演示
public class Main {
    public static void main(String[] args) {
        Library library = new Library();
        library.addBook(new Book("The Catcher in the Rye"));
        library.addBook(new Book("To Kill a Mockingbird"));

        for (Book book : library.getBooks()) {
            System.out.println("Book Title: " + book.getTitle());
        }
    }
}
结果
Book Title: The Catcher in the Rye
Book Title: To Kill a Mockingbird

3. 什么是组合?

组合是关联的一种形式,其中子对象的生命周期依赖于父对象的生命周期。如果父对象被销毁,子对象也会被销毁。这表示一种强大的关系和所有权。

3.1 组合示例

考虑 HouseRoom 类,其中房屋包含房间。房间不能独立于房屋存在。
示例
import java.util.ArrayList;
import java.util.List;

public class House {
    private List<Room> rooms = new ArrayList<>();

    public House() {
        rooms.add(new Room("Living Room"));
        rooms.add(new Room("Bedroom"));
    }

    public List<Room> getRooms() {
        return rooms;
    }

    private class Room {
        private String name;

        public Room(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
}
演示
public class Main {
    public static void main(String[] args) {
        House house = new House();
        
        for (House.Room room : house.getRooms()) {
            System.out.println("Room Name: " + room.getName());
        }
    }
}
结果
Room Name: Living Room
Room Name: Bedroom

4. 结论

总而言之,理解关联、聚合和组合之间的区别对于设计有效的面向对象系统至关重要。每种关系类型都反映了不同程度的依赖性和所有权,帮助您准确地模拟现实世界场景。
如果您有任何问题或需要进一步澄清,请随时在下方评论!

更多文章请访问: 面向对象编程中理解关联、聚合和组合

© . All rights reserved.