Các mẫu thiết kế trong Ruby – Các mẫu kết cấu – Mẫu mặt tiền

Tram Ho

Intent (khái quát)

Facade là một structural design pattern cung cấp giao diện đơn giản cho thư viện, framework hoặc bất kỳ tập hợp phức tạp nào khác của các class.

Problem (vấn đề)

Hãy tưởng tượng rằng bạn phải làm cho mã của mình hoạt động với một tập hợp các đối tượng thuộc về một thư viện hay framework. Thông thường, bạn cần phải 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.

Do đó, logic nghiệp vụ trong các class của bạn sẽ trở nên gắn kết chặt chẽ với các chi tiết triển khai của các class bên thứ 3, khiến cho việc hiểu và duy trì rất khó khăn.

Solution (giải pháp)

facade là một lớp cung cấp giao diện đơn giản cho một hệ thống con phức tạp chứa nhiều 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à khách hàng thực sự quan tâm.

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

Ví dụ như bạn có một ứng dụng giúp tải các video ngắn vui nhộn với mèo lên phương tiện truyền thông xã hội, sử dụng thư viện chuyển đổi video chuyên nghiệp. Tuy nhiên, tất cả những gì thực sự cần chỉ là một phương thức duy nhất encode(filename, format) . Sau khi tạo một lớp với một phương thức 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.

Real-World Analogy (liên hệ với thực tế)

Khi bạn gọi một cửa hàng để đặt hàng bằng điện thoại, Một tổng đài viên là facade của bạn cho tất cả các dịch vụ của các phòng ban trong cửa hàng. Tổng đài viên cung cấp cho bạn một giao diện thoại đơn giản cho hệ thống đặt hàng, cổng thanh toán và các dịch vụ giao hàng khác nhau.

Structure (cách tổ chức)

  1. Facadecung 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 hệ thống con. Nó biết nơi thưc hiện yêu cầu của client và cách mà tất cả các bộ phận vận hành.
  2. Additional Facade có thể được tạo để ngăn ô nhiễm một facade, 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. Additional Facade có thể được sử dụng bởi cả Client và các facade khác.
  3. Complex Subsystem bao gồm hàng tá đố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 hệ thống con, như khởi tạo các đối tượng theo đúng thứ tự và cung cấp cho chúng dữ liệu theo định dạng thích hợp.
    Các class của hệ thống con không hề 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.

Applicability (sử dụng khi)

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

How to Implement (cách cài đặt)

  1. Kiểm tra xem có thể cung cấp giao diện đơn giản hơn so với những gì hệ thống con hiện có đã cung cấp hay không. Bạn có thể đi đúng hướng nếu giao diện này làm cho client code độc lập với nhiều lớp của hệ thống con.
  2. Khai báo và triển khai giao diện này trong lớp facade mới. Facade sẽ chuyển hướng các lời gọi từ client code đến các đối tượng thích hợp của hệ thống con. Facade phải chịu trách nhiệm khởi tạo hệ thống con và quản lý vòng đời tiếp theo của nó trừ khi client code đã thực hiện việc này.
  3. Để nhận được toàn bộ lợi ích từ pattern, làm cho tất cả client code chỉ giao tiếp với hệ thống con thông qua facade. Bây giờ mã máy khách được tách biệt khỏi mọi thay đổi trong mã hệ thống con. Ví dụ, khi một hệ thống con được nâng cấp lên phiên bản mới, bạn sẽ chỉ cần sửa đổi mã ở facade.
  4. Nếu facade trở nên quá lớn, hãy xem xét trích xuất một phần hành vi của nó sang một lớp facade mới, hãy tinh tế.

Decorator in Ruby (ví dụ với ngôn ngữ ruby)

main.rb:

output.txt:

Tham khảo

refactoring.guru

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo