Sự khác biệt triển khai giữa Tổng hợp và Thành phần trong Java


102

Tôi biết sự khác biệt về khái niệm giữa Tổng hợp và Bố cục. Ai đó có thể cho tôi biết sự khác biệt triển khai trong Java giữa chúng với các ví dụ không?


3
Theo liên kết này, bạn có thể nhận được câu trả lời cho bài đăng của mình [Sự khác biệt giữa Tổng hợp và Thành phần] [1] [1]: stackoverflow.com/a/1468285/1353243
gks 9/12/12

có thể bản sao của tập hợp so với phần
Alex K


Khi chúng ta có bất kỳ mối quan hệ nào giữa các đối tượng, đó được gọi là Hiệp hội. Tổng hợp và Thành phần đều là hình thức Hiệp hội chuyên biệt. Thành phần lại là dạng chuyên biệt của Tổng hợp. javabench.in/2011/08/difference-between-association.html
Raúl

bạn có thể tìm thêm câu trả lời ở đây
hamed moosaei

Câu trả lời:


222

Thành phần

final class Car {

  private final Engine engine;

  Car(EngineSpecs specs) {
    engine = new Engine(specs);
  }

  void move() {
    engine.work();
  }
}

Tổng hợp

final class Car {

  private Engine engine;

  void setEngine(Engine engine) {
    this.engine = engine;
  }

  void move() {
    if (engine != null)
      engine.work();
  }
}

Trong trường hợp thành phần, Động cơ hoàn toàn được gói gọn bởi Xe. Không có cách nào để thế giới bên ngoài có được tham chiếu đến Động cơ. Động cơ sống chết với xe. Với sự tổng hợp, Ô tô cũng thực hiện các chức năng của mình thông qua Động cơ, nhưng Động cơ không phải lúc nào cũng là một bộ phận bên trong Ô tô. Động cơ có thể được hoán đổi hoặc thậm chí bị loại bỏ hoàn toàn. Không chỉ vậy, thế giới bên ngoài vẫn có thể tham chiếu đến Động cơ và mày mò với nó bất kể nó đang ở trong Ô tô.


7
Ví dụ tuyệt vời! Nó cũng cho thấy bố cục là liên kết mạnh (Xe không có ý nghĩa nếu không có Động cơ) và tổng hợp là liên kết yếu (Xe không có động cơ hoàn toàn có ý nghĩa, thậm chí nó không cần một liên kết trong cấu tạo của nó). Cái nào để sử dụng? Phụ thuộc vào bối cảnh.
Federico Pugnali

@Và ví dụ bạn đưa ra trong Tổng hợp không phải là ví dụ phụ thuộc này sao? Sự phụ thuộc là một dạng quan hệ yếu hơn và theo thuật ngữ mã chỉ ra rằng một lớp sử dụng một lớp khác theo tham số hoặc kiểu trả về.
OOkhan

@Anav: bạn có thể giải thích thêm tại sao bạn nói: trong trường hợp sáng tác thì không có cách nào để thế giới bên ngoài có thể tham chiếu đến Engine, với tổng hợp thế giới bên ngoài có thể tham chiếu đến Engine được không? Bạn có thể hiển thị trong mẫu mã, làm thế nào thế giới bên ngoài có thể hoặc không thể có tham chiếu đến động cơ? cảm ơn
O Connor

9
Đây không phải là một ví dụ chính xác. Thế giới bên ngoài có thể tiếp cận đối tượng bên trong nhưng danh tính của nó luôn gắn liền với đối tượng bên ngoài trong khi tổng thể đối tượng bên trong có thể tồn tại độc lập ngay cả khi không có xe hơi. Trong trường hợp này, một động cơ vẫn có thể được tạo ra bằng cách new Engine(EngineSpecs)gọi ngay cả khi không có xe. Cách để đạt được bố cục là tạo Động cơ như một lớp bên trong, để một đối tượng của động cơ luôn được tạo với tham chiếu đến Đối tượng ô tô
mickeymoon

@mickeymoon bắt tuyệt vời. bạn có thể chỉ cho chúng tôi một ví dụ tốt hơn không?
Gayan Weerakutti

19

Tôi sẽ sử dụng một ví dụ UML đẹp.

Lấy một trường đại học có từ 1 đến 20 khoa khác nhau và mỗi khoa có từ 1 đến 5 giáo sư. Có một liên kết thành phần giữa một trường Đại học và các khoa của nó. Có một liên kết tổng hợp giữa một bộ phận và các giáo sư của nó.

Thành phần chỉ là một tập hợp MẠNH MẼ, nếu trường đại học bị phá hủy thì các khoa cũng nên bị phá hủy. Nhưng chúng ta không nên giết các giáo sư ngay cả khi các khoa tương ứng của họ biến mất.

Trong java:

public class University {

     private List<Department> departments;

     public void destroy(){
         //it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
         if(departments!=null)
             for(Department d : departments) d.destroy();
         departments.clean();
         departments = null;
     }
}

public class Department {

     private List<Professor> professors;
     private University university;

     Department(University univ){
         this.university = univ;
         //check here univ not null throw whatever depending on your needs
     }

     public void destroy(){
         //It's aggregation here, we just tell the professor they are fired but they can still keep living
         for(Professor p:professors)
             p.fire(this);
         professors.clean();
         professors = null;
     }
}

public class Professor {

     private String name;
     private List<Department> attachedDepartments;

     public void destroy(){

     }

     public void fire(Department d){
         attachedDepartments.remove(d);
     }
}

Một cái gì đó xung quanh điều này.


tôi hy vọng tôi sẽ không nhận được bất kỳ bình luận nào về danh sách không được khởi tạo và không có hàm tạo. Tôi viết điều này một cách nhanh chóng, các bộ phận còn thiếu là lẽ thường nhưng nếu hỏi tôi sẽ hoàn thành giải pháp
TecHunter

Cảm ơn! Ví dụ của bạn là hoàn toàn rõ ràng. Nhưng tôi không thể hiểu mã minh họa của bạn. Bạn có thể cho tôi biết sự khác biệt thực hiện cơ bản giữa hai? Nếu tôi phải triển khai Tổng hợp hoặc thành phần, tôi nên sử dụng khái niệm nào trong Java?
Rajath

đó là chính xác việc thực hiện tương tự nếu bạn nói về lớp NHƯNG thành phần nên được phản ánh bởi cách bạn quản lý các trường hợp như trong chỉnh sửa của tôi
TecHunter

4

Có một lời giải thích tuyệt vời trong url nhất định bên dưới.

nhập mô tả hình ảnh ở đây

http://www.codeproject.com/Articles/330447/Undilities-Assosystem-Aggregation-and-Composit

Hãy kiểm tra!!!


Xin chào Rahul, mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. Vui lòng xem tại đây: Tại sao và làm thế nào một số câu trả lời bị xóa?
bummi

3

Sự khác biệt là bất kỳ thành phần nào là một tập hợp và không phải ngược lại.

Hãy thiết lập các điều khoản. Tổng hợp là một đại lượng đo lường trong tiêu chuẩn UML và có nghĩa là CẢ thành phần và tổng hợp được chia sẻ, được đặt tên đơn giản là shared . Nó thường được đặt tên không chính xác là "tổng hợp". Nó là BAD, vì bố cục cũng là một tập hợp. Theo tôi hiểu, bạn có nghĩa là "được chia sẻ".

Hơn nữa từ tiêu chuẩn UML:

composite - Cho biết thuộc tính được tổng hợp một cách lịch sự, tức là đối tượng tổng hợp có trách nhiệm đối với sự tồn tại và lưu trữ của các đối tượng (bộ phận) được cấu thành.

Vì vậy, liên kết Đại học với cathedras là một thành phần, bởi vì cathedra không tồn tại ngoài Đại học (IMHO)

Ngữ nghĩa chính xác của tập hợp được chia sẻ khác nhau tùy theo khu vực ứng dụng và trình mô hình.

Tức là, tất cả các liên kết khác có thể được rút ra dưới dạng tổng hợp được chia sẻ, nếu bạn chỉ tuân theo một số nguyên tắc của bạn hoặc của người khác. Cũng xem ở đây .


3

Nói một cách dễ hiểu:

Cả Thành phần và Tổng hợp đều là Hiệp hội. Thành phần -> Mối quan hệ Has-A mạnh mẽ Tổng hợp -> Mối quan hệ Has-A yếu.


2

Một chương trình sáng tác đơn giản

public class Person {
    private double salary;
    private String name;
    private Birthday bday;

    public Person(int y,int m,int d,String name){
        bday=new Birthday(y, m, d);
        this.name=name;
    }


    public double getSalary() {
        return salary;
    }

    public String getName() {
        return name;
    }

    public Birthday getBday() {
        return bday;
    }

    ///////////////////////////////inner class///////////////////////
    private class Birthday{
        int year,month,day;

        public Birthday(int y,int m,int d){
            year=y;
            month=m;
            day=d;
        }

        public String toString(){
           return String.format("%s-%s-%s", year,month,day);

        }
    }

    //////////////////////////////////////////////////////////////////

}
public class CompositionTst {

    public static void main(String[] args) {
        // TODO code application logic here
        Person person=new Person(2001, 11, 29, "Thilina");
        System.out.println("Name : "+person.getName());
        System.out.println("Birthday : "+person.getBday());

        //The below object cannot be created. A bithday cannot exixts without a Person 
        //Birthday bday=new Birthday(1988,11,10);

    }
}

2

Đầu tiên chúng ta phải nói về sự khác biệt thực sự giữa AggregationCompositionsẽ ở trên cùng một trang.

Tổng hợp là một liên kết mà thực thể được liên kết có thể tồn tại độc lập với liên kết. Ví dụ, một Người có thể được liên kết với một Tổ chức nhưng người đó có thể tồn tại độc lập trong hệ thống.

trong khi

Thành phần đề cập đến một tình huống khi một trong những thực thể liên kết có liên quan chặt chẽ với thực thể kia và không thể tồn tại nếu không có sự tồn tại của đối tượng kia. Trên thực tế, danh tính của thực thể đó luôn gắn liền với danh tính của đối tượng kia. Ví dụ, bánh xe trong ô tô.

Giờ đây, việc tổng hợp có thể đạt được đơn giản bằng cách nắm giữ tài sản của một thực thể trong một thực thể khác như sau:

class Person {
    Organisation worksFor;
}

class Organisation {
    String name;
}

class Main {
    public static void main(String args[]) {

        //Create Person object independently
        Person p = new Person();

        //Create the Organisation independently
        Organisation o = new Organisation();
        o.name = "XYZ Corporation";

        /*
          At this point both person and organisation 
          exist without any association  
        */
        p.worksFor = o;

    }
}

Đối với Thành phần, đối tượng phụ thuộc luôn được tạo ra với danh tính của đối tượng liên kết của nó. Bạn có thể sử dụng một lớp bên trong cho cùng một lớp.

class Car {
    class Wheel {
        Car associatedWith;
    }
}

class Main {
    public static void main() {
        //Create Car object independently
        Car car = new Car();

        //Cannot create Wheel instance independently
        //need a reference of a Car for the same.
        Car.Wheel wheel = car.new Wheel();
    }
}

Xin lưu ý rằng cùng một trường hợp sử dụng có thể được tổng hợp / thành phần tùy thuộc vào tình huống ứng dụng. Ví dụ: trường hợp Tổ chức - Nhân sự có thể trở thành thành phần nếu bạn đang phát triển một ứng dụng cho những người làm việc trong một tổ chức nào đó và phải tham chiếu đến tổ chức để đăng ký. Tương tự, nếu bạn đang duy trì khoảng không quảng cáo cho các bộ phận của Ô tô, thì mối quan hệ Xe-Bánh có thể là tổng hợp.


1

Tổng hợp so với Thành phần

Tính tổng hợp ngụ ý một mối quan hệ trong đó con cái có thể tồn tại độc lập với cha mẹ. Ví dụ: Ngân hàng và Nhân viên, xóa Ngân hàng và Nhân viên vẫn tồn tại.

trong khi Thành phần ngụ ý một mối quan hệ mà đứa trẻ không thể tồn tại độc lập với cha mẹ. Ví dụ: Con người và trái tim, trái tim không tồn tại tách biệt với con người.

Quan hệ tổng hợp là "has-a"thành phần là quan hệ "part of".

Thành phần là một Hiệp hội mạnh trong khi Tổng hợp là một Hiệp hội yếu.


0

Tất nhiên, cả hai loại đều là liên kết, và không thực sự được ánh xạ chặt chẽ với các yếu tố ngôn ngữ như vậy. Sự khác biệt là ở mục đích, ngữ cảnh và cách hệ thống được mô hình hóa.

Như một ví dụ thực tế, hãy so sánh hai loại hệ thống khác nhau với các thực thể tương tự:

  • Hệ thống đăng ký ô tô chủ yếu theo dõi ô tô và chủ sở hữu của chúng, v.v. Ở đây, chúng tôi không quan tâm đến động cơ như một thực thể riêng biệt, nhưng chúng tôi vẫn có thể có các thuộc tính liên quan đến động cơ, như công suất và loại nhiên liệu. Ở đây Động cơ có thể là một bộ phận tổng hợp của thực thể ô tô.

  • Hệ thống quản lý cửa hàng dịch vụ ô tô quản lý các bộ phận ô tô, bảo dưỡng ô tô và thay thế các bộ phận, có thể là động cơ hoàn chỉnh. Ở đây chúng tôi thậm chí có thể có động cơ dự trữ và cần phải theo dõi chúng và các bộ phận khác một cách riêng biệt và độc lập với ô tô. Ở đây Động cơ có thể là một bộ phận tổng hợp của thực thể ô tô.

Làm thế nào bạn triển khai điều này bằng ngôn ngữ của bạn là mối quan tâm nhỏ vì ở cấp độ đó, những thứ như khả năng đọc quan trọng hơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.