Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Composite Pattern #11

Open
tuananhhedspibk opened this issue Mar 13, 2022 · 0 comments
Open

Composite Pattern #11

tuananhhedspibk opened this issue Mar 13, 2022 · 0 comments

Comments

@tuananhhedspibk
Copy link
Owner

tuananhhedspibk commented Mar 13, 2022

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: ProductsBoxes. Box có thể chứa một vài Products hoặc thậm chí các Boxes nhỏ hơn ...

Screen Shot 2022-03-13 at 12 33 26

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 ProductsBoxes 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

Screen Shot 2022-03-13 at 15 24 54

  1. Component interface định nghĩa các operations chung mà các elements đơn giản và phức tạp đều có
  2. 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ả.
  3. 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

  1. 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.
  1. 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant