# Facade pattern

### Bách khoa toàn thư mở Wikipedia

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ữ.

## [sửa] Thí dụ

### [sửa] 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 qủa 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.valueOf(a[0]).intValue(),
                  Integer.valueOf(a[1]).intValue()-1 /* !!! */, Integer.valueOf(a[2]).intValue());
        }
        public void addDays(int days) { gcal.add(Calendar.DAY_OF_MONTH, days); }
        public String toString() { return new Formatter().format("%1$tY-%1$tm-%1$td", gcal).toString();}
    }

    /** "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);
        }
    }

## [sửa] Xem thêm

- Adapter pattern
- Mediator pattern
- Singleton pattern

## [sửa] Liên kết bên ngoài

- Description from the Portland Pattern Repository
- Description by Vince Huston

Lấy từ “http://vi.wikipedia.org../../../f/a/c/Facade_pattern.html”

Thể loại: Dạng thức thiết kế

##### Views

- Bài viết
- Thảo luận
- Phiên bản hiện hành

##### Tìm kiếm

##### Ngôn ngữ khác

- Deutsch
- English
- Español
- Français
- Italiano
- Nederlands
- 日本語
- Polski
- Português
- Русский
- ไทย