Khi thiết kế class-diagram bằng UML, chắc hẳn ai cũng gặp khúc mắc về sự khác nhau giữa hai quan hệ aggregation và composition. Thực ra chẳng có gì là khó khăn cả nếu các bạn đọc qua 2 trường hợp ví dụ về 2 quan hệ trên.
* Giống nhau: cả hai đều là quan hệ kết hợp ( association).
Aggregation ( tập hợp) là quan hệ giữa toàn thể và bộ phận, trong đó một lớp biểu diễn cái lớn hơn(tổng thể) còn lớp kia biểu diễn cái nhỏ hơn(bộ phận). Aggregation biểu diễn quan hệ has-a, có nghĩa rằng một đối tượng của lớp tổng thể có nhiều đối tượng của lớp thành phần. Ví dụ: Một môn học được mở (cái này trong học tín chỉ) có nhiều sinh viên theo học, môn học được mở là class tổng thể, còn sinh viên là class thành phần. Nếu không có môn học được mở thì sinh viên vẫn tồn tại, hoặc khi hủy môn học được mở đi thì sinh viên vẫn không bị hủy.
Composition (gộp), ngược lại, mạnh hơn aggregation về sự phụ thuộc lẫn nhau, ví dụ cho dễ hiểu nhé: Một công ty (Company) có nhiều phòng ban( Department). Như thế khi công ty bị hủy đi thì phòng ban (Department) không còn tồn tại, hoặc Một phòng học( Class-room) có nhiều bàn ghế (table), thực tế là tất cả các phòng học đều có bàn ghế riêng cho từng phòng và bàn của phòng nào đều có mã số phòng đi kèm với mã số bàn, như vậy nếu phòng học bị hủy thì bàn ghể của phòng đó bị hủy theo (composition relationship). Tuy nhiên nếu ta đặt vấn đề khác đi một tí là có một số bàn trong kho, có một lúc nào đó muốn mở một số phòng học tăng cường thì trong trường hợp này số bàn trong kho đó không thuộc về nhất định một phòng nào cả như thế khi phòng học tăng cường bị hủy thì bàn trong kho này không bị hủy.
Trong class-diagram thì quan hệ aggregation được biểu diễn bằng đoạn thẳng kết thúc bởi hạt kim cương trắng gần với lớp toàn thể(aggregate class).
Trong class-diagram thì quan hệ composition được biểu diễn bằng đoạn thẳng kết thúc bởi hạt kim cương màu đen.
* Hai quan hệ này trong JAVA được thể hiện thế nào?
Một ví dụ bằng code so sánh cách thể hiện Aggregation và Composition. Ở trên là cách thể hiện Composition, vì acc sẽ bị hủy khi Client bị hủy. Ngược lại ở dưới là cách thể hiện Aggregation, acc ko bị hủy khi Client bị hủy mà có thể tồn tại độc lập:
Class Client
{
BankAccount acc = new BankAccount();
public void addMoneyToBankAccount(decimal amount)
{
acc.AddMoney(amount);
}
public decimal CheckBalance()
{
return acc.CheckAccountBalance();
}
}
Class Client
{
BankAccount acc;
public Client(BankAccount p_acc)
{
acc=p_acc;
}
public void addMoneyToBankAccount(decimal amount)
{
acc.AddMoney(amount);
}
public decimal CheckBalance()
{
return acc.CheckAccountBalance();
}
}
Ref: http://tienlong.wordpress.com/2010/11/04/so-sanh-aggregation-v%E1%BB%9Bi-composition-khi-thiet-ke-class-diagram/
cảm ơn tác giả :)
Trả lờiXóahay <3
Trả lờiXóa