Nội dung
Facade là một mẫu thiết kế cấu trúc cung cấp một giao diện đơn giản (nhưng có giới hạn) cho một hệ thống phức tạp gồm các lớp, thư viện hoặc framework.
Trong khi Facade giảm độ phức tạp tổng thể của ứng dụng, nó cũng giúp chuyển các phần phụ thuộc không mong muốn đến một nơi.
Cách sử dụng mẫu
Sử dụng: Mẫu Facade thường được sử dụng trong các ứng dụng được viết bằng Python. Nó đặc biệt hữu ích khi làm việc với các thư viện và API phức tạp.
Nhận dạng: Facade có thể được nhận dạng trong một lớp có giao diện đơn giản, nhưng ủy quyền hầu hết công việc cho các lớp khác. Thông thường, các facade quản lý toàn bộ vòng đời của các đối tượng mà chúng sử dụng.
Chương trình mẫu
main.cpp
from __future__ import annotations
class Facade:
"""
Lớp Facade cung cấp một giao diện đơn giản cho logic phức tạp của một
hoặc một số hệ thống con. Facade ủy quyền yêu cầu của client cho các đối
tượng thích hợp trong hệ thống con. Facade cũng chịu trách nhiệm quản lý
vòng đời của chúng. Tất cả điều này bảo vệ client khỏi sự phức tạp không
mong muốn của hệ thống con.
"""
def __init__(self, subsystem1: Subsystem1, subsystem2: Subsystem2) -> None:
"""
Tùy thuộc vào nhu cầu của ứng dụng, bạn có thể cung cấp cho Facade
các đối tượng hệ thống con hiện có hoặc buộc Facade tự tạo chúng.
"""
self._subsystem1 = subsystem1 or Subsystem1()
self._subsystem2 = subsystem2 or Subsystem2()
def operation(self) -> str:
"""
Các phương thức của Facade là những lối tắt thuận tiện cho chức năng
phức tạp của các hệ thống con. Tuy nhiên, client chỉ nhận được một
phần nhỏ khả năng của hệ thống con.
"""
results = []
results.append("Facade initializes subsystems:")
results.append(self._subsystem1.operation1())
results.append(self._subsystem2.operation1())
results.append("Facade orders subsystems to perform the action:")
results.append(self._subsystem1.operation_n())
results.append(self._subsystem2.operation_z())
return "\n".join(results)
class Subsystem1:
"""
Subsystem có thể chấp nhận các yêu cầu từ mặt tiền hoặc trực tiếp từ client.
Trong mọi trường hợp, đối với Subsystem, Facade vẫn là một ứng dụng
khách khác và nó không phải là một phần của Subsystem.
"""
def operation1(self) -> str:
return "Subsystem1: Ready!"
# ...
def operation_n(self) -> str:
return "Subsystem1: Go!"
class Subsystem2:
"""
Một số facade có thể hoạt động với nhiều hệ thống con cùng một lúc.
"""
def operation1(self) -> str:
return "Subsystem2: Get ready!"
# ...
def operation_z(self) -> str:
return "Subsystem2: Fire!"
def client_code(facade: Facade) -> None:
"""
Client hoạt động với các hệ thống con phức tạp thông qua một giao diện đơn
giản do Facade cung cấp. Khi một Facade quản lý vòng đời của hệ thống con,
client thậm chí có thể không biết về sự tồn tại của hệ thống con. Cách tiếp cận
này cho phép bạn kiểm soát mức độ phức tạp.
"""
print(facade.operation(), end="")
if __name__ == "__main__":
# Client có thể có một số đối tượng của hệ thống con đã được tạo. Trong
# trường hợp này, có thể đáng giá khi khởi tạo Facade bằng những đối
# tượng này thay vì để Facade tạo các thể hiện mới.
subsystem1 = Subsystem1()
subsystem2 = Subsystem2()
facade = Facade(subsystem1, subsystem2)
client_code(facade)
Kết quả
Facade initializes subsystems:
Subsystem1: Ready!
Subsystem2: Get ready!
Facade orders subsystems to perform the action:
Subsystem1: Go!
Subsystem2: Fire!
Để lại một bình luận