Design Pattern | Facade Pattern

Khi câc bộ phận trong hệ thống của bạn trở nên lớn hơn, chúng tự nhiên trở nên phức tạp hơn. Điều này có thể gây ra sự nhầm lẫn cho các client class trong hệ thống của bạn sử dụng. Mặc dù vậy, sự phức tạp của hệ thống không phải là dấu hiệu của thiết kế kém. Phạm vi của vấn đề bạn đang cố giải quyết có thể rất lớn, nó đòi hỏi một giải pháp phức tạp.

Tuy nhiên, client class sẽ thích một tương tác đơn giản hơn. The Facade Pattern Design cung cấp một giao diện đơn giản hóa duy nhất cho các lớp máy khách (client class) tương tác với hệ thống con (subsystem).

Facade là gì ? Nếu bạn từng đi mua sắm tại một cửa hàng bán lẻ, ăn tại nhà hàng hoặc đặt mua bất cứ thứ gì trực tuyến, bạn đã có kinh nghiệm tương tác với Facade Pattern trong thế giới thực. Hình ảnh mình đi xuống phố tìm một nơi để ăn tối, bạn tìm kiếm điều gì khi bạn đang trên vỉa hè đường phố ? Đương nhiên, bạn tìm kiếm một dấu hiệu trên mặt tòa nhà cho biết rằng nội dung trong tòa nhà này có thể cung cấp cho bạn dịch vụ ăn uống. Tương tự, khi bạn mua sắm trực tuyên, bạn tìm một số dấu hiệu trang web bên ngoài  có cửa hàng ảo, dựa vào ý nghĩa của tên miền, dòng mô tả về trang web .v.v Khi người phục vụ nhận và đặt hàng hoặc khi nền tảng bán hàng trực tuyến gửi đơn hàng của bạn được thực hiện, họ sẽ đóng vai trò là một phần của Facade bằng cách ẩn đi tất cả cấc công việc phụ cần phải hoàn thành. Bạn có thể mua hàng hóa và dịch vụ mà không cần phải biết yêu cầu được xử lý  như thế nào. Toàn bộ việc xây dựng các tòa nhà, nhân viên phục vụ, thực đơn, trang web và nhiều thành phần nằm phía sau Facade.

Hãy nhớ rằng một Facade không thực sự bổ sung thêm chức năng, một Facade chỉ hoạt động như một điểm xâm nhập vào hệ thống hoạt động của bạn.

Trong phần mềm, Facade Pattern thực hiện chính xác những gì người phục vụ hoặc nhân viên bán hàng sẽ làm trong cuộc sống thực. Facade là một lớp bao bọc, đóng gói hệ thống con để che giấu sự phức tạp của hệ thống con. Lớp bao bọc này sẽ có phép Client Class tương tác với hệ thống con qua một Facade.


Chúng ta hãy xem Client Class sẽ tương tác thế nào với hệ thống con mà không có Facade Pattern cho một hệ thống ngân hàng đơn giản. Không có một class facade, lớp khách hàng sẽ chứa các instance của các lớp checking, saving, investment. Điều này có nghĩa là khách hàng có trách nhiệm khởi tạo chính xác từng lớp này và biết về tất cả thuộc tính và phương thức khác nhau của chúng. Điều này giống như phải quản lý tất cả các tài khoản tài chính của bạn trong cuộc sống thực, có thể phức tạp vối nhiều tài khoản thay vì một tổ chức tài chính làm điều đó cho bạn.


Thay vào đó, hãy cùng xem lớp dịch vụ ngân hàng hoạt động như một Facade cho các lớp Checking, Saving, Investment. Lớp client (khách hàng) không còn cần phải xử lý việc khởi tạo hoặc đối phó với bất kỳ sự phức tạp nào khác của quản ý tài chính. Do ba tài khoản khacs nhau đều được thực hiện giao dịch IAcount, lớp BankService của ngân hàng đang bao bọc một cách hiệu quả các lớp giao thoa tài khoản và đưa ra một mô hình đơn giản hơn cho lớp Customer sử dụng, Facade Pattern rất đơn giản để áp dụng trong ví dụ về tài khoản ngân hàng của chúng ta. Nó kết hợp thực hiện giao diện bởi một hay nhiều lớp mà sau đó được bao bọc  bởi một lớp Facade. Hãy xem cách làm đó sau đây.

Bước một, thiết kế giao diện. Giao diện (interface) Java này là giao diện sẽ được các lớp tài khoản khác nhau triển khai và sẽ không biết đến với lớp Customer.

Bước hai, thực hiện interface với một hoặc nhiều lớp. Hãy nhớ rằng các interface cho phép chúng ta tạo các subtypes là checking, saving, investment, là các subtypes của IAccount và dự kiến sẽ hoạt động giống như một loại tài khoản. Tiếp theo, bạn sẽ triển khai giao diện với các lớp sẽ được bao bọc với các lớp Facade của chúng ta. Trong ví dụ này, chỉ thực hiện ẩn một giao diện, nhưng trong thực tế, một lớp Facade có thể được sử dụng để bọc tất cả giao diện và các lớp trong một hệ thống con. Đó là quyết định của bạn sau này.

Bước thứ ba, tạo lớp Facade và bọc các lớp thực hiện giao diện. Các lớp dịch vụ ngân hàng là Facade, sao làm được vậy ? Lưu ý rằng các phương thức công khai của nó rất đơn giản để sử dụng và không hiển thị gợi ý nào về giao diện cơ bản và các lớp triển khai. Một điều cần lưu ý là chúng ta đặt các công cụ sửa đổi truy cập cho mỗi tài khoản là riêng tư. Vì toàn bộ điểm của Facade Pattern là che giấu sự phức tạp, chúng ta sử dụng nguyên tắc thiết kế ẩn thông tin để ngăn tất cả các lớp khách hàng nhìn thấy các đối tượng tài khoản và cách tài khoản này hoạt động.

Bước bốn, sử dụng Facade class để truy cập hệ thống con. Các lớp khách hàng có thể truy cập các chức năng của tài khoản khác nhau thông qua các phương thức của lớp BankService. Lớp BankService sẽ cho khách hàng biết loại hành động nào sẽ cho phép khách hàng được quyền "gọi", và sau đó sẽ ủy thác hành động đó cho các đối tượng tài khoản thích hợp.


Bây giờ chúng ta đã có Facade của chúng ta, lớp khách hàng có thể truy cập vào tài khoản của mình thông qua dịch vụ ngân hàng, lớp khách hàng của bạn không cần phải lo lắng về việc tạo và quản lý tài khoản của riêng mình. Khách hàng chỉ cần biết về BankService và tập hợp hành vi của BankService có thể thực hiện.

Chúng ta đã che giấu một cách hiệu quả sự phức tạp của việc quản lý tài khoản từ khách hàng bằng việc sử dụng lớp Facade BankService, Facade Pattern tương tự như các mẫu thiết kế các ở chỗ nó đóng gói để ẩn các chi tiết của một số phần trong hệ thống của chúng ta. Có thể dễ dàng làm cho các mẫu thiết kế này bị lẫn lộn, vì vậy, hãy tóm tắt những gì đặc trưng cho Facade Pattern.

Loại bỏ sự cần thiết của các lớp máy khách để tự mình quản lý các hệ thống con, dẫn đến việc kết nối ít hơn giữa hệ thống con và các lớp máy khách.

Xử lý việc khởi tạo và chuyển hướng các nhiệm vụ đến lớp thích hợp trong hệ thống con.

Hoạt động đơn giản như một điểm vào hệ thống con và không thêm chức năng cho hệ thống con.

Facade Pattern là một cách để cung cấp cho các lớp khách hàng như một phương tiện tương tác dễ dàng hơn với các bộ phận trong hê thống của bạn. Các hệ thống phức tạp có thể khó sử dụng và điều hướng. Bằng cách cung cấp các giao diện đơn giản hơn thông qua mặt tiền, các lớp máy khách sẽ có thời gian sử dụng phần mềm của bạn dễ dàng hơn.

Nhận xét

Đăng nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Những thuật toán nền tảng trong lĩnh vực Trí tuệ nhân tạo (Artificial Intelligence I)