Giới thiệu về Façade Pattern:

Nghiêm Nguyễn Công
VelaCorp
Published in
5 min readDec 24, 2018

1. Façade Pattern là gì?

Chắc các bạn đã từng nghe đến khái niệm Structural Pattern. Đó là một mẫu Design Pattern được gọi là nhóm thiết kế cấu trúc phần mềm. Trong đó có nhiều mẫu thiết kế, ví dụ như Adapter, Bridge, Composite, Façade, Proxy…

Hôm nay tôi xin giới thiệu về Façade Pattern, một mẫu thiết kế sử dụng việc xây dựng một giao diện chung để client giao tiếp với một hệ thống phức tạp.

2. Tại sao ta nên sử dụng Façade Pattern để thiết kế cấu trúc phần mềm ?

Hãy tưởng tượng bạn muốn lấy số liệu của khách hàng với các thuộc tính Name, Address, PhoneNumber.

Mà trong các thuộc tính đó gồm nhiều thuộc tính khác, ví dụ Name cần có firstName, middleName, lastName. Address gồm city, street, country. PhoneNumber có phoneNumber và postalCode.

Để client giao tiếp và lấy thông tin từ các class này sẽ rất phức tạp nên ta sẽ thiết kế một class PersonFaçade giúp client giao tiếp đơn giản hơn.

Với thiết kế này, client chỉ cần giao tiếp với PersonFacade mà không cần quan tâm đến các class subsystem phía sau.

Ta có các class subsystem sau :

Class Address :

package facade;public class Address {    String city;    String street;    String country;    public Address() {    }    public Address(String city, String street, String country) {        this.city = city;        this.street = street;        this.country = country;    }    public String getCity() {        return city;    }    public void setCity(String city) {        this.city = city;    }    public String getStreet() {        return street;    }    public void setStreet(String street) {        this.street = street;    }    public String getCountry() {        return country;    }    public void setCountry(String country) {        this.country = country;    }    public void display() {        System.out.println("Address: " + this.street + "-" + this.city + "-" + this.country);    }}

Class Address gồm có các thuộc tính city, Street, country, hàm khởi tạo có tham số và các hàm getter, setter . Có phương thức void display () để in thông tin.

Class Name:

package facade;public class Name {    String firstName;    String middleName;    String lastName;    public Name() {    }    public Name(String firstName, String middleName, String lastName) {        this.firstName = firstName;        this.middleName = middleName;        this.lastName = lastName;    }    public String getFirstName() {        return firstName;    }    public void setFirstName(String firstName) {        this.firstName = firstName;    }    public String getMiddleName() {        return middleName;    }    public void setMiddleName(String middleName) {        this.middleName = middleName;    }    public String getLastName() {        return lastName;    }    public void setLastName(String lastName) {        this.lastName = lastName;    }    public void display() {        System.out.println("Name : " + this.firstName + " " + this.middleName + " " + this.lastName);    }}

Class Name có các thuộc tính firstName, middleName, lastName, hàm khởi tạo có tham số và các hàm setter, getter. Có phương thức void display () để in thông tin

Class PhoneNumber :

package facade;public class PhoneNumber {    String phoneNumber;    String postalCode;    public PhoneNumber() {    }    public PhoneNumber(String phongNumber, String postalCode) {        this.phoneNumber = phongNumber;        this.postalCode = postalCode;    }    public String getPhoneNumber() {        return phoneNumber;    }    public void setPhoneNumber(String phoneNumber) {        this.phoneNumber = phoneNumber;    }    public String getPostalCode() {        return postalCode;    }    public void setPostalCode(String postalCode) {        this.postalCode = postalCode;    public void display() {        System.out.println("PhoneNumber: " + " " + this.phoneNumber + " " +this.postalCode);    }}

Class PhoneNumber có các thuộc tính phoneNumber, postalCode, hàm khởi tạo có tham số và các phương thức setter, getter. Có phương thức void display () để lấy thông tin.

Tiếp theo, ta xây dựng Class PersonFacade có 3 thuộc tính là 3 class Name, Address, PhoneNumber với hàm khởi tạo có tham số và các phương thức setter, getter :

package facade;import java.util.Scanner;public class PersonPacade {
Name name;
Address address;
PhoneNumber phoneNumber;
public PersonPacade() {

}

public PersonPacade(Name name, Address address, PhoneNumber phoneNumber) {

this.name = name;

this.address = address;

this.phoneNumber = phoneNumber;

}
public Name getName() {

return name;

}

public void setName(Name name) {

this.name = name;

}
public Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}
public PhoneNumber getPhoneNumber() {

return phoneNumber;

}

public void setPhoneNumber(PhoneNumber phoneNumber) {

this.phoneNumber = phoneNumber;

}

Đặc biệt, trong Class PersonFacade sẽ có phương thức void display () bao gói 3 phương thức display () trong 3 class, phương thức sẽ thực hiện việc lấy thông tin của cả 3 Class .

public void display() {    this.name.display();    this.address.display();    this.phoneNumber.display();    System.out.println("---------------------------");}

Ta có thêm phương thức setInfomation () để nhập dữ liệu vào rồi sau đó lưu thông tin vào các lớp.

public void setInfomation() {        Scanner scanner = new Scanner(System.in);        System.out.println("Nhap duong:");        String street = scanner.nextLine();        System.out.println("Nhap thanh pho:");        String city = scanner.nextLine();        System.out.println("Nhap dat nuoc:");        String country = scanner.nextLine();        System.out.println("Nhap ho:");        String firstName = scanner.nextLine();        System.out.println("Nhap dem:");        String middleName = scanner.nextLine();        System.out.println("Nhap ten:");        String lastName = scanner.nextLine();        System.out.println("Nhap so dien thoai:");        String phoneNumber = scanner.nextLine();        System.out.println("Nhap ma vung: ");        String postalCode = scanner.nextLine();        this.phoneNumber = new PhoneNumber(phoneNumber, postalCode);        this.address = new Address(street, city, country);        this.name = new Name(firstName, middleName, lastName);        scanner.close();    }}

Cuối cùng ta xây dựng Class Demo để test chức năng của Class PersonFacade :

import facade.PersonPacade;

public class Demo {

public static void main(String[] args) {
PersonPacade person = new PersonPacade();
person.setInfomation();
person.display();
}
}

Qua ví dụ trên, ta có thể thấy tác dụng của Façade Pattern cung cấp một giao diện thống nhất trong một hệ thống con, giúp việc tương tác đơn giản hơn.

Với việc này cũng mang lại lợi ích giúp che giấu các triển khai của các lớp phía sau, và việc sửa đổi hoặc mở rộng dễ dàng hơn.

3.Khi nào ta cần sử dụng Façade Pattern

- Khi ta muốn bao bọc, che giấu tính phức tạp trong các hệ thống con.- Khi ta muốn đưa ra một giao diện đơn giản cho client giao tiếp với một hệ thống phức tạp.

- Khi muốn phân tầng các lớp con, thì Façade sẽ định nghĩa cổng giao tiếp chung cho mỗi hệ thống con, do đó giúp đơn giản hóa sự phụ thuộc của các hệ thống con vì các hệ thống con chỉ giao tiếp với nhau thông qua các cổng giao diện chung đó.

Như vậy, chúng ta đã biết được về mục đích, cách triển khai của Façade Pattern. Qua bài viết hy vọng các bạn hiểu thêm về Façade Pattern.

--

--