Trước tiên, chúng ta hãy cùng cafedev giới thiệu mọi thứ về Facade Design Pattern và phần code ví dụ chi tiết nhằm giúp ace dễ hiểu khi áp dụng trên các ngôn ngữ khác nhau. Ace có thể tham khảo thêm các bài khác tại series Design Pattern tại đây.

Facade là một phần của Gang of Four design pattern và nó được phân loại theo Structural design patterns. Trước khi tìm hiểu chi tiết về nó, chúng ta hãy thảo luận về một số ví dụ sẽ được giải quyết bằng pattern cụ thể này.

Vì vậy, Như tên cho thấy, nó có nghĩa là bộ mặt của tòa nhà. Những người đi qua đường chỉ có thể nhìn thấy mặt kính này của tòa nhà. Họ không biết bất cứ điều gì về nó, hệ thống dây điện, đường ống và những phức tạp khác. Nó che giấu tất cả sự phức tạp của tòa nhà và hiển thị một bộ mặt thân thiện.

1. Các ví dụ khác

Trong Java, giao diện JDBC có thể được gọi là một Facade bởi vì, chúng ta với tư cách là người dùng hoặc khách hàng tạo kết nối bằng giao diện “java.sql.Connection”, việc triển khai mà chúng ta không quan tâm. Việc triển khai được để cho nhà cung cấp trình điều khiển.

Một ví dụ điển hình khác có thể kể đến là khởi động máy tính. Khi một máy tính khởi động, nó liên quan đến công việc của cpu, bộ nhớ, ổ cứng, v.v. Để giúp người dùng dễ sử dụng, chúng ta có thể thêm một giao diện bao bọc mức độ phức tạp của tác vụ và thay vào đó cung cấp một giao diện đơn giản.

Tương tự đối với Facade Design Pattern . Nó che giấu sự phức tạp của hệ thống và cung cấp một giao diện cho client để từ đó client có thể truy cập vào hệ thống.

Sơ đồ Facade Design Pattern

Bây giờ Chúng ta hãy thử và hiểu rõ hơn về Facade Design Pattern bằng một ví dụ đơn giản. Hãy xem xét một khách sạn. Khách sạn này có một người giữ khách sạn. Có rất nhiều nhà hàng trong khách sạn như nhà hàng Veg, nhà hàng Non-Veg và Veg / Non.

Bạn, với tư cách là khách hàng muốn truy cập vào các menu khác nhau của các nhà hàng khác nhau. Bạn không biết họ có những menu khác nhau là gì. Bạn chỉ có thể tiếp cận với người giữ khách sạn, người biết rõ về khách sạn của anh ta. Bất cứ thực đơn nào bạn muốn, bạn hãy nói với người giữ khách sạn và anh ta sẽ mang nó ra khỏi các nhà hàng tương ứng và giao cho bạn. Ở đây, người giữ khách sạn đóng vai trò là Facade , vì anh ta che giấu sự phức tạp của khách sạn hệ thống.

Hãy xem nó hoạt động như thế nào:

2. Giao diện của Hotel

package structural.facade; 
public interface Hotel 
{ 
    public Menus getMenus(); 
} 

Interface khách sạn chỉ trả về các Menu.

Tương tự, Nhà hàng có ba loại và có thể triển khai interface khách sạn. Hãy xem code của một trong các Nhà hàng.

NonVegRestaurant.javaVeg

package structural.facade; 
  
public class NonVegRestaurant implements Hotel 
{ 
    public Menus getMenus() 
    { 
        NonVegMenu nv = new NonVegMenu(); 
        return nv; 
    } 
} 

Restaurant.java

package structural.facade; 
  
public class VegRestaurant implements Hotel 
{ 
    public Menus getMenus() 
    { 
        VegMenu v = new VegMenu(); 
        return v; 
    } 
} 

VegNonBothRestaurant.java

package structural.facade; 
  
public class VegNonBothRestaurant implements Hotel 
{ 
    public Menus getMenus() 
    { 
        Both b = new Both(); 
        return b; 
    } 
} 

Bây giờ chúng ta hãy xem xét Facade,

HotelKeeper.java

package structural.facade; 
  
public class HotelKeeper 
{ 
    public VegMenu getVegMenu() 
    { 
        VegRestaurant v = new VegRestaurant(); 
        VegMenu vegMenu = (VegMenu)v.getMenus(); 
        return vegMenu; 
    } 
      
    public NonVegMenu getNonVegMenu() 
    { 
        NonVegRestaurant v = new NonVegRestaurant(); 
        NonVegMenu NonvegMenu = (NonVegMenu)v.getMenus(); 
        return NonvegMenu; 
    } 
      
    public Both getVegNonMenu() 
    { 
        VegNonBothRestaurant v = new VegNonBothRestaurant(); 
        Both bothMenu = (Both)v.getMenus(); 
        return bothMenu; 
    }     
} 

Từ đó, rõ ràng là việc triển khai phức tạp sẽ được thực hiện bởi chính HotelKeeper. Khách hàng sẽ chỉ cần truy cập HotelKeeper và yêu cầu thực đơn Veg, NonVeg hoặc VegNon Both Restaurant.

Chương trình khách hàng sẽ tiếp cận mặt tiền(Facade) này như thế nào?

package structural.facade; 
  
public class Client 
{ 
    public static void main (String[] args) 
    { 
        HotelKeeper keeper = new HotelKeeper(); 
          
        VegMenu v = keeper.getVegMenu(); 
        NonVegMenu nv = keeper.getNonVegMenu(); 
        Both = keeper.getVegNonMenu(); 
  
    } 
} 

Bằng cách này, việc triển khai được gửi đến mặt tiền(Facade). Máy khách chỉ được cung cấp một giao diện và chỉ có thể truy cập vào giao diện đó. Điều này ẩn tất cả những phức tạp.

3. Khi nào nên sử dụng Pattern này?

Facade Design Pattern phù hợp khi bạn có một hệ thống phức tạp mà bạn muốn hiển thị với khách hàng một cách đơn giản hoặc bạn muốn tạo một lớp giao tiếp bên ngoài trên hệ thống hiện có không tương thích với hệ thống. Mặt tiền(Facade) giao dịch với các giao diện, không thực hiện. Mục đích của nó là che giấu sự phức tạp bên trong đằng sau một giao diện đơn giản mà bên ngoài có vẻ đơn giản.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!