Facade pattern

Trong lập trình máy tính, một dạng thức ngoài mặt là một đối tượng mà đối tượng này cung cấp một giao diện (interface) đơn giản để che đi phần mã phức tạp bên trong, ví dụ như là một thư viện lớp (class library ). Một dạng thức ngoài mặt có thể:

 Giúp cho một thư viện phần mềm trở nên đơn giản hơn trong việc sử dụng và trong việc hiểu nó, vì dạng thức ngoài mặt có các phương thức tiện lợi cho các tác vụ chung;
 Giúp cho các đoạn mã có sử dụng thư viện trở nên dễ đọc hơn, cũng lý do như trên;
 Giảm sự phụ thuộc của các khối mã bên ngoài với hiện thực bên trong của thư viện, vì hầu hết các khối mã đều dùng dạng thức ngoài mặt, vì thế cho phép sự linh động trong phát triển các hệ thống;
 Đóng gói tập các hàm API được thiết kế không tốt bằng một hàm API đơn có thiết kế tốt.

Một dạng thức ngoài mặt là một dạng thức thiết kế hướng đối tượng.

Façades rất hay dùng trong thiết kế hướng đối tượng. Ví dụ, các thư viện chuẩn Java chứa hàng tá lớp đảm nhiệm việc phân tách (parsing) các tập tin phông chữ (font file) để hiển thị văn bản (rendering text) thành từng đường nét hình học và cuối cùng thành các điểm màn hình (pixels). Tuy nhiên, hầu hết các lập trình viên Java đều không nhận biết được những chi tiết này, vì thư viện cũng chứa các lớp facade (Font và Graphics - riêng Graphics được bao đóng bởi một lớp khác là Graphics2D để có thể cung cấp nhiều chức năng hơn) mà cung cấp các phương thức đơn giản hơn cho hầu hết các tác vụ chung liên quan đến phông chữ.

Thí dụ

Java 

Ví dụ sau đây che phần API calendar phức tạp bởi một facede thân thiện hơn. Kết quả là:
 Date: 1980-08-20
 20 days after: 1980-09-09
import java.util.*;

/** "Facade" */
class UserfriendlyDate
{
    GregorianCalendar gcal;
     
    public UserfriendlyDate(String isodate_ymd) {
        String[] a = isodate_ymd.split("-");
        gcal = new GregorianCalendar(Integer.parseInt(a[0]),
              Integer.parseInt(a[1])-1 /* !!! */, Integer.parseInt(a[2]));
    }
    public void addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); }
    public String toString() { return String.format("%1$tY-%1$tm-%1$td", gcal);}
}

/** "Client" */
class FacadePattern
{
    public static void main(String[] args) 
    {  
        UserfriendlyDate d = new UserfriendlyDate("1980-08-20");   
        System.out.println("Date: "+d);   
        d.addDays(20);   
        System.out.println("20 days after: "+d);
    }
}

C++ 

class Ink {
     public:
         void CheckInk() {
             cout << "+ Check ink done" << "\n";
         }
};

class Paper {
     public:
         void CheckPaper() {
             cout << "+ Check paper" << "\n";
         }
         void GetPaperForPrinting() {
             cout << "+ Get paper for printing" << "\n";
         }
 };

class PrinterEngine {
     public:
         void LoadDocument() {
             cout << "+ Load document from computer" << "\n";
         }
         void FormatDocumentData() {
             cout << "+ Format data" << "\n";
         }
         void WarmUp() {
             cout << "+ Engine was warm up" << "\n";
         }
         void PrepareLaser() {
             cout << "+ Prepare laser" << "\n";
         }
         void InkToPaper() {
             cout << "+ Ink to paper" << "\n";
         }
};

/* Facade */
class PrinterController {
     public:
         void Print() {
             Ink ink;
             Paper paper;
             PrinterEngine engine;
 
             ink.CheckInk();
             paper.CheckPaper();
             engine.LoadDocument();
             engine.FormatDocumentData();
             paper.GetPaperForPrinting();
             engine.PrepareLaser();
             engine.WarmUp();
             engine.InkToPaper();
         }
 };

/** Client **/
int main() {
     cout << "I want to print document" << "\n";
 
     PrinterController printer;
     printer.Print();
 
     cout << "I had printed document" << "\n";
}

Xem thêm 
 Adapter pattern
 Mediator pattern
 Singleton pattern

Liên kết bên ngoài 
 Description from the Portland Pattern Repository
 Description by Vince Huston

Tham khảo

Mẫu thiết kế phần mềm