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?
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?
Câu trả lời:
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ô.
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ô
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.
Có một lời giải thích tuyệt vời trong url nhất định bên dưới.
http://www.codeproject.com/Articles/330447/Undilities-Assosystem-Aggregation-and-Composit
Hãy kiểm tra!!!
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 .
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);
}
}
Đầu tiên chúng ta phải nói về sự khác biệt thực sự giữa Aggregation
và Composition
sẽ ở 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.
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" và 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.
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.