1. Facade Pattern là gì?
Facade (Mặt tiền) Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Pattern này cung cấp một giao diện chung đơn giản thay cho một nhóm các giao diện có trong một hệ thống con (subsystem). Facade Pattern định nghĩa một giao diện ở một cấp độ cao hơn để giúp cho người dùng có thể dễ dàng sử dụng hệ thống con này.
Facade Pattern cho phép các đối tượng truy cập trực tiếp giao diện chung này để giao tiếp với các giao diện có trong hệ thống con. Mục tiêu là che giấu các hoạt động phức tạp bên trong hệ thống con, làm cho hệ thống con dễ sử dụng hơn.
Ví dụ để khởi động một chiếc TV thì cần phải khởi động nguồn, khởi động màn hình, khởi động loa,… thay vì phải khởi động riêng lẻ từng bộ phận như thế thì nhà sản xuất làm sẵn một nút nguồn, chúng ta chỉ cần ấn vào nút này là có thể khởi động toàn bộ hệ thống của chiếc TV, đây là một ví dụ trực quan về Facade Pattern.
2. Cấu trúc?

3. Sử dụng Facade Pattern khi nào?
- Khi hệ thống có rất nhiều lớp làm người sử dụng rất khó để có thể hiểu được quy trình xử lý của chương trình. Và khi có rất nhiều hệ thống con mà mỗi hệ thống con đó lại có những giao diện riêng lẻ của nó nên rất khó cho việc sử dụng phối hợp. Khi đó có thể sử dụng Facade Pattern để tạo ra một giao diện đơn giản cho người sử dụng một hệ thống phức tạp.
- Khi người sử dụng phụ thuộc nhiều vào các lớp cài đặt. Việc áp dụng Façade Pattern sẽ tách biệt hệ thống con của người dùng và các hệ thống con khác, do đó tăng khả năng độc lập và khả chuyển của hệ thống con, dễ chuyển đổi nâng cấp trong tương lai.
- Khi bạn muốn phân lớp các hệ thống con. Dùng Façade Pattern để định nghĩa cổng giao tiếp chung cho mỗi hệ thống con, do đó giúp giảm sự phụ thuộc của các hệ thống con vì các hệ thống này chỉ giao tiếp với nhau thông qua các cổng giao diện chung đó.
- Khi bạn muốn bao bọc, che giấu tính phức tạp trong các hệ thống con đối với phía Client.
4. Cách triển khai và code ví dụ
Có nhiều cách để triển khai Facade Pattern, ở đây mình xin giới thiệu 2 cách
Cách 1
using System;
namespace DesignPatternFacade
{
class SubSystemOne
{
public void MethodOne()
{
Console.WriteLine(" SubSystemOne Method");
}
}
class SubSystemTwo
{
public void MethodTwo()
{
Console.WriteLine(" SubSystemTwo Method");
}
}
class Facade
{
private SubSystemOne _one;
private SubSystemTwo _two;
public Facade()
{
_one = new SubSystemOne();
_two = new SubSystemTwo();
}
public void Method()
{
_one.MethodOne();
_two.MethodTwo();
}
}
class Program
{
public static void Main()
{
Facade facade = new Facade();
// Thay vì phải gọi lần lượt MethodOne trong SubSystemOne và
// MethodTwo trong SubSystemTwo thì ta chỉ cần gọi Method của
// class facade
facade.Method();
Console.ReadKey();
}
}
}
Cách 2: Áp dụng khi số lượng class con lớn.
using System;
using System.Collections.Generic;
namespace DesignPatternFacade
{
interface IFacade
{
void DoSomeThing();
}
class SubSystemOne : IFacade
{
public void DoSomeThing()
{
Console.WriteLine(" SubSystemOne Method");
}
}
class SubSystemTwo : IFacade
{
public void DoSomeThing()
{
Console.WriteLine(" SubSystemTwo Method");
}
}
class Program
{
public static void Main()
{
IFacade _one = new SubSystemOne();
IFacade _two = new SubSystemTwo();
// Khi số lượng các class con lớn, thì ta có thể triển khai
// facade pattern theo dạng này để tối ưu số dòng code
// cần phải viết. Thay vì phải gọi lần lượt các
// hàm DoSomeThing() thì ta có thể dùng vòng lặp ForEach
var lstFacade = new List<IFacade>();
lstFacade.Add(_one);
lstFacade.Add(_two);
lstFacade.ForEach(item => item.DoSomeThing());
Console.ReadLine();
}
}
}