Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Facade Design Pattern trong C#: Khái niệm và triển khai

Facade Pattern cung cấp một interface đơn giản (unified interface) cho một tập hợp các interface phức tạp trong một subsystem. Facade che giấu độ phức tạp bên trong, client chỉ tương tác với Facade.

Các thành phần

  • Subsystem classes: Các class phức tạp, làm việc thực tế (Light, Music, AC...).
  • Facade: Class đơn giản, delegate calls đến các subsystem.
  • Client: Chỉ dùng Facade, không biết subsystem.

Ví dụ: Hệ thống nhà thông minh (Smart Home)

// Subsystems
public class Lights
{
    public void TurnOn() => Console.WriteLine("Lights: ON");
    public void TurnOff() => Console.WriteLine("Lights: OFF");
}

public class MusicSystem
{
    public void TurnOn() => Console.WriteLine("Music: ON");
    public void TurnOff() => Console.WriteLine("Music: OFF");
}

public class AirConditioner
{
    public void TurnOn() => Console.WriteLine("AC: ON");
    public void TurnOff() => Console.WriteLine("AC: OFF");
}

// Facade
public class HomeFacade
{
    private readonly Lights _lights = new Lights();
    private readonly MusicSystem _music = new MusicSystem();
    private readonly AirConditioner _ac = new AirConditioner();

    public void LeaveHome()
    {
        Console.WriteLine("=== Leaving Home ===");
        _lights.TurnOff();
        _music.TurnOff();
        _ac.TurnOff();
    }

    public void ArriveHome()
    {
        Console.WriteLine("=== Arriving Home ===");
        _lights.TurnOn();
        _music.TurnOn();
        _ac.TurnOn();
    }

    public void MovieMode()
    {
        Console.WriteLine("=== Movie Mode ===");
        _lights.TurnOff();
        _music.TurnOn();
        _ac.TurnOn();
    }
}

// Client
class Program
{
    static void Main()
    {
        var home = new HomeFacade();
        home.LeaveHome();
        Console.WriteLine();
        home.MovieMode();
        Console.ReadLine();
    }
}

Kết quả

=== Leaving Home ===
Lights: OFF
Music: OFF
AC: OFF

=== Movie Mode ===
Lights: OFF
Music: ON
AC: ON

Ưu / Nhược điểm

Ưu điểmNhược điểm
Đơn giản hóa API cho clientFacade có thể trở thành "God Object" nếu quá to
Giảm coupling client-subsystemChe giấu tính năng nâng cao của subsystem
Dễ refactor subsystem bên trongVi phạm Dependency Inversion nếu Facade tạo new subsystem (nên inject)
Đơn giản hóa testing (mock Facade)

Facade vs Các pattern khác

  • Adapter: Chuyển interface này sang interface khác (khớp interface). Facade: Cung cấp interface mới đơn giản hơn.
  • Mediator: Điều phối giao tiếp giữa nhiều đối tượng ngang hàng. Facade: Đơn giản hóa truy cập subsystem phân cấp.
  • Abstract Factory: Tạo family đối tượng. Facade: Sử dụng đối tượng đã có.

Ứng dụng thực tế

  • HttpClient (facade cho HTTP stack phức tạp).
  • DbContext trong EF Core (facade cho tracking, query, connection...).
  • API Gateway (Facade cho microservices).
  • Library wrapper (vd: ImageProcessor facade cho OpenCV, ImageSharp...).