Bridge Pattern

Giả sử bạn có một method xử lý phức tạp bao gồm nhiều công việc. Mỗi công việc lại có thể có nhiều option để xử lý khác nhau. Ví dụ như muốn trình bày menu món ăn của một nhà hàng trên một website bao gồm các thành phần của menu:

  • Tên nhà hàng
  • Món ăn
  • Slogan

Để đỡ nhàm chán, menu sẽ được thay đổi format tùy theo ngày thường và ngày cuối tuần và rất có thể sau này sẽ bổ sung thêm các format cho các ngày lễ khác nhau. Như vậy, mỗi phần của menu (tên nhà hàng, món ăn …) sẽ có format tùy theo menu cụ thể. Để tận dụng tính tái sử dụng và tính đa dạng, ta có thể dùng Bridge Pattern.

Bridge pattern này dùng để tách rời phần định nghĩa chức năng và phần cài đặt của một class sao cho hai phần này không bị ràng buộc quá chặt chẽ với nhau. Điều này sẽ giúp cho các chức năng hoạt động linh hoạt hơn nhờ có thể thích ứng với các thay đổi dễ dàng hơn vì ko bị ràng buộc.

Class Diagram

  • Abstraction 
    • định nghĩa các chức năng cần tách rời.
    • lưu giữ một đối tượng cài đặt cụ thể để sử dụng vào lúc runtime.
  • RefinedAbstraction 
    • cài đặt cho Abstraction.
  • Implementor
    • định nghĩa các method cần để Abstraction sử dụng. Lưu ý là các phương thức của Implementor không nhất thiết phải giống theo các method của abstraction. Các method của Implementor chỉ là các methods để hỗ trợ hoạt động cho các phương thức của abstraction.
  • ConcreteImplementor
    • cài đặt thực cho Implementor

Code mẫu

Kết quả thực thi

Có vài lời muốn chia sẻ với các bạn ở đây tôi đã tìm hiểu tại sao pattern này có tên là Bridge pattern vì chữ “bridge” (cây cầu) chẳng liên quan gì mấy đến mục đích của pattern này theo như GOF:

“Decouple an abstraction from its implementation so that the two can vary independently”

… Và cuối cùng tôi cũng đã hiểu ý đồ tại sao nó lại có tên như vậy. Nguyên nhân là do khi decouple implementor ra khỏi class chính, client cần một “cây cầu” bắc qua để gọi tới các method trong implementor mỗi khi access đến abstraction, và abstraction ở đây đã đóng vai trò làm cây cầu nối giữa 2 bên với nhau. Hy vọng với giải nghĩa này các bạn có cái nhin rõ hơn về pattern này. Enjoy coding! 🙂

No Comments

Post A Comment