Facade pattern

Bách khoa toàn thư mở Wikipedia
Bước tới: menu, tìm kiếm

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 (FontGraphics - 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ụ[sửa | sửa mã nguồn]

Java[sửa | sửa mã nguồn]

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);
    }
}

Xem thêm[sửa | sửa mã nguồn]

Liên kết bên ngoài[sửa | sửa mã nguồn]