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 C#. 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
Program.cs
using System;
namespace DesignPatterns.Facade.Conceptual
{
// 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.
public class Facade
{
protected Subsystem1 _subsystem1;
protected Subsystem2 _subsystem2;
public Facade(Subsystem1 subsystem1, Subsystem2 subsystem2)
{
this._subsystem1 = subsystem1;
this._subsystem2 = subsystem2;
}
// 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.
public string Operation()
{
string result = "Facade initializes subsystems:\n";
result += this._subsystem1.operation1();
result += this._subsystem2.operation1();
result += "Facade orders subsystems to perform the action:\n";
result += this._subsystem1.operationN();
result += this._subsystem2.operationZ();
return result;
}
}
// 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.
public class Subsystem1
{
public string operation1()
{
return "Subsystem1: Ready!\n";
}
public string operationN()
{
return "Subsystem1: Go!\n";
}
}
// Một số facade có thể hoạt động với nhiều hệ thống con cùng một lúc.
public class Subsystem2
{
public string operation1()
{
return "Subsystem2: Get ready!\n";
}
public string operationZ()
{
return "Subsystem2: Fire!\n";
}
}
class Client
{
// 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.
public static void ClientCode(Facade facade)
{
Console.Write(facade.Operation());
}
}
class Program
{
static void Main(string[] args)
{
// 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 = new Subsystem1();
Subsystem2 subsystem2 = new Subsystem2();
Facade facade = new Facade(subsystem1, subsystem2);
Client.ClientCode(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