You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Pattern này cho phép ta có thể kết hợp các objects lại thành một cấu trúc cây, sau đó làm việc với cấu trúc cây này như thể nó là các objects riêng lẻ.
Vấn đề
Sử dụng Composite pattern chỉ phát huy tác dụng khi core model của bạn có cấu trúc cây.
Lấy ví dụ trong thực tế, bạn có 2 loại objects: Products và Boxes. Box có thể chứa một vài Products hoặc thậm chí các Boxes nhỏ hơn ...
Vấn đề ta gặp phải là khi tính tổng giá tiền. Trong thực tế ta có thể mở toàn bộ các Boxes ra rồi tính tổng tiền nhưng trong chương trình điều này không đơn giản chỉ là chạy mấy vòng lặp for là xong.
Do các classes này sẽ lồng nhau (ít hoặc nhiều tầng) nên việc tính trực tiếp như vậy là điều không thể.
Giải pháp
Composite pattern cho rằng nên sử dụng Products và Boxes thông qua một interface chung - interface này sẽ định nghĩa method dùng cho việc tính giá tiền.
Method này sẽ hoạt động như thế nào ? Với product nó sẽ trả về giá tiền của product luôn, còn với box thì nó sẽ duyệt qua toàn bộ các items bên trong box, nếu gặp box con bên trong nó sẽ duyệt các items bên trong box con rồi tính giá tiền, cứ thế cho đến khi toàn bộ giá tiền của các components con trong box được tính thì thôi.
Method này sẽ chạy một cách đệ quy để tính giá tiền
Cách làm này có ưu điểm ở chỗ bạn không cần quan tâm đến class của object mà bạn đang tính tiền. Bạn sẽ xử lí chúng như nhau thông qua một interface chung. Khi bạn gọi method, object sẽ truyền request xuống theo độ sâu của cây.
Cấu trúc
Component interface định nghĩa các operations chung mà các elements đơn giản và phức tạp đều có
Leaf là element thấp nhất, không có sub-element. Leaf sẽ thực hiện công việc trên thực tế do chúng không thể chuyển tiếp công việc xuống cho element nào thấp hơn cả.
Container có các sub element, một container không hề biết gì về class của sub element mà chỉ làm việc với sub element thông qua interface chung mà thôi. Khi nhận được request, nó sẽ chuyển tiếp xuống cho sub element hoặc các containers con. Container chỉ xử lí các kết quả trung gian và trả về kết quả cuối cùng cho client mà thôi.
Tính ứng dụng
Sử dụng Composite pattern
khi bạn cần triển khai các cấu trúc tương tự như cấu trúc cây. Composite pattern cho phép chúng ta sử dụng 2 loại components:
Simple leave
Complex container: có thể chứa leaves và các containers con khác.
Pattern này cho phép client code xử lí simple và complex elements như nhau. Mọi elements đều được định nghĩa thông quan một interface chung. Bằng interface này, client không cần lo lắng về class của object mà nó làm việc cùng.
The text was updated successfully, but these errors were encountered:
Pattern này cho phép ta có thể kết hợp các objects lại thành một cấu trúc cây, sau đó làm việc với cấu trúc cây này như thể nó là các objects riêng lẻ.
Vấn đề
Sử dụng Composite pattern chỉ phát huy tác dụng khi core model của bạn có cấu trúc cây.
Lấy ví dụ trong thực tế, bạn có 2 loại objects:
Products
vàBoxes
.Box
có thể chứa một vàiProducts
hoặc thậm chí cácBoxes
nhỏ hơn ...Vấn đề ta gặp phải là khi tính tổng giá tiền. Trong thực tế ta có thể mở toàn bộ các
Boxes
ra rồi tính tổng tiền nhưng trong chương trình điều này không đơn giản chỉ là chạy mấy vòng lặpfor
là xong.Do các classes này sẽ lồng nhau (ít hoặc nhiều tầng) nên việc tính trực tiếp như vậy là điều không thể.
Giải pháp
Composite pattern cho rằng nên sử dụng
Products
vàBoxes
thông qua một interface chung - interface này sẽ định nghĩa method dùng cho việc tính giá tiền.Method này sẽ hoạt động như thế nào ? Với product nó sẽ trả về giá tiền của product luôn, còn với box thì nó sẽ duyệt qua toàn bộ các items bên trong box, nếu gặp box con bên trong nó sẽ duyệt các items bên trong box con rồi tính giá tiền, cứ thế cho đến khi toàn bộ giá tiền của các components con trong box được tính thì thôi.
Cách làm này có ưu điểm ở chỗ bạn không cần quan tâm đến class của object mà bạn đang tính tiền. Bạn sẽ xử lí chúng như nhau thông qua một interface chung. Khi bạn gọi method, object sẽ truyền request xuống theo độ sâu của cây.
Cấu trúc
Component
interface định nghĩa các operations chung mà các elements đơn giản và phức tạp đều cóLeaf
là element thấp nhất, không có sub-element. Leaf sẽ thực hiện công việc trên thực tế do chúng không thể chuyển tiếp công việc xuống cho element nào thấp hơn cả.Container
có các sub element, một container không hề biết gì về class của sub element mà chỉ làm việc với sub element thông qua interface chung mà thôi. Khi nhận được request, nó sẽ chuyển tiếp xuống cho sub element hoặc các containers con. Container chỉ xử lí các kết quả trung gian và trả về kết quả cuối cùng cho client mà thôi.Tính ứng dụng
khi bạn cần triển khai các cấu trúc tương tự như cấu trúc cây. Composite pattern cho phép chúng ta sử dụng 2 loại components:
The text was updated successfully, but these errors were encountered: