close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

Design Patterns: Facade

Mục tiêu

Facade là một mẫu thiết kế cấu trúc cung cấp giao diện đơn giản hóa thư viện, framework hoặc bất kỳ tập hợp lớp phức tạp nào khác.

Vấn đề

Hãy tưởng tượng rằng bạn phải làm cho chương trình của mình hoạt động với một loạt các đối tượng thuộc về một thư viện hoặc framework phức tạp. Thông thường, bạn cần khởi tạo tất cả các đối tượng đó, theo dõi các phụ thuộc, thực thi các phương thức theo đúng thứ tự, v.v. Kết quả là, các lớp trong chương trình của bạn sẽ trở nên kết hợp chặt chẽ với các chi tiết triển khai của các lớp bên thứ ba, khiến bạn khó hiểu và khó duy trì.

Giải pháp

Facade là một lớp cung cấp một giao diện đơn giản cho một hệ thống con phức tạp chứa nhiều bộ phận chuyển động. Một Facade có thể cung cấp chức năng hạn chế so với làm việc trực tiếp với hệ thống con. Tuy nhiên, nó chỉ bao gồm những tính năng mà client thực sự quan tâm.

Có một Facade rất hữu ích khi bạn cần tích hợp ứng dụng của mình với một thư viện phức tạp có hàng tá tính năng, nhưng bạn chỉ cần một ít chức năng của nó.

Chẳng hạn một ứng dụng tải các video ngắn hài hước về mèo lên mạng xã hội có thể sử dụng thư viện chuyển đổi video chuyên nghiệp. Tuy nhiên, tất cả những gì nó thực sự cần là một lớp có phương thức mã hóa encode(filename, format). Sau khi tạo một lớp như vậy và kết nối nó với thư viện chuyển đổi video, bạn sẽ có Facade đầu tiên của mình.

Cấu trúc

  1. Complex Subsystemcung cấp quyền truy cập thuận tiện vào một phần cụ thể của chức năng của hệ thống con. Nó biết trực tiếp nơi yêu cầu của client và cách vận hành tất cả các bộ phận.
  2. Một lớp Additional Facade bổ sung có thể được tạo để ngăn chặn việc gây ô nhiễm cho một facade đơn lẻ với các tính năng không liên quan có thể làm cho nó trở thành một cấu trúc phức tạp khác. Các facade bổ sung có thể được sử dụng bởi cả client và các facade khác.
  3. Hệ thống con phức hợp (Complex Subsystem) bao gồm hàng chục đối tượng khác nhau. Để làm cho tất cả chúng làm điều gì đó có ý nghĩa, bạn phải đi sâu vào chi tiết triển khai của hệ thống con, chẳng hạn như khởi tạo các đối tượng theo đúng thứ tự và cung cấp cho chúng dữ liệu ở định dạng thích hợp. Các lớp hệ thống con không biết về sự tồn tại của facade. Chúng hoạt động trong hệ thống và làm việc trực tiếp với nhau.
  4. Client sử dụng facade thay vì gọi trực tiếp các đối tượng hệ thống con.

Khả năng áp dụng

  • Sử dụng mẫu Facade khi bạn cần có một giao diện hạn chế nhưng đơn giản cho một hệ thống con phức tạp.
  • Sử dụng Facade khi bạn muốn cấu trúc một hệ thống con thành các lớp.

Ưu và nhược điểm

😄😄😄

 Có thể tách mã của mình khỏi sự phức tạp của hệ thống con.

🙁🙁🙁

Một Facade có thể trở thành một đối tượng thần thánh (god object) cùng với tất cả các lớp của một ứng dụng.

Mối quan hệ với các mẫu khác

Facade định nghĩa một giao diện mới cho các đối tượng hiện có, trong khi Adapter cố gắng làm cho giao diện hiện có có thể sử dụng được. Adapter thường chỉ bao bọc một đối tượng, trong khi Facade hoạt động với toàn bộ hệ thống con của các đối tượng.

Abstract Factory có thể phục vụ như một giải pháp thay thế cho Facade khi bạn chỉ muốn ẩn cách các đối tượng hệ thống con được tạo ra khỏi mã client.

Flyweight cho thấy cách tạo nhiều đối tượng nhỏ, trong khi Facade cho thấy cách tạo một đối tượng duy nhất đại diện cho toàn bộ hệ thống con.

Facade và Mediator có những công việc tương tự nhau: chúng cố gắng tổ chức sự hợp tác giữa nhiều lớp được kết hợp chặt chẽ với nhau.

  • Facade xác định một giao diện đơn giản cho một hệ thống con của các đối tượng, nhưng nó không giới thiệu bất kỳ chức năng mới nào. Bản thân hệ thống con không biết về Facade. Các đối tượng trong hệ thống con có thể giao tiếp trực tiếp.
  • Mediator tập trung giao tiếp giữa các thành phần của hệ thống. Các thành phần chỉ biết về đối tượng dàn xếp và không giao tiếp trực tiếp.

Một lớp Facade thường có thể được chuyển đổi thành một Singleton vì một đối tượng facade duy nhất là đủ trong hầu hết các trường hợp.

Facade tương tự như Proxy ở chỗ, cả hai đều đệm một thực thể phức tạp và tự khởi tạo nó. Không giống như Facade, Proxy có giao diện giống với đối tượng dịch vụ của nó, điều này làm cho chúng có thể hoán đổi cho nhau.

Chương trình tham khảo

C++

C#

Python


Đã đăng vào

trong

bởi

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *