+6

[Desing-Patern] - Facade Patern

Have a nice day!

Ngẫu hứng ngồi xem lại design pattern, thấy hay hay nên viết lại chia sẻ mọi người.

Facade Design Patern

Facade Patern thuộc vào họ mô hình cấu trúc (structural patern) và Facade patern phát biểu rằng :

"just provide a unified and simplified interface to a set of interfaces in a subsystem, therefore it hides the complexities of the subsystem from the client"

Tức là Facade patern đơn giản hóa một tập các interface trong hệ thống con và chỉ một cung cấp interface chung duy nhất cho client. Từ interface chung này client có thể dễ dàng truy cập vào hệ thống mà không hề hay biết sự phức tạp (cách thức hoạt động) của các hệ thống con cấu thành tổng thể hệ thống lớn.

Tóm lại : Facade Pattern định nghĩa một interface ở một cấp độ cao hơn để giúp cho người dùng có thể dễ dàng sử dụng hệ thống con này vì chỉ cần giao tiếp với một interface chung duy nhất.

  • Thực tế, một Abstract Factory là một dạng của Facade.

Điểm mạnh của Facade Patern

  • Che đi sự phức tạp của các thành phần hệ thống con (phụ) đối với client
  • Khắc phục cấu trúc khớp nối lỏng lẻo giữa các hệ thống con với nhau và giữa các hệ thống con với client.

Khi nào nên sử dụng Facade Patern ???

  • Khi người dùng muốn cung cấp một interface đơn giản (simple interface) cho một hệ thống phức tạp
  • Khi người sử dụng bị phụ thuộc vào các lớp cài đặt bên dưới. Facade patern sẽ tách biệt ra hệ thống cho người dùng với các hệ thống con khác. Do đó tăng "tính khả chuyển" và "tính độc lập" của các hệ thống con, trường hợp trong tương gặp lỗi hoặc cần nâng cấp các hệ thống con thì công việc sẽ dễ dàng hơn.
  • Các hệ thống con thường được phân cấp, phân lớp. Mà chúng lại có những đặc điểm interface riêng biệt. Việc sử dụng interface chung để phối hợp các hệ thống con sẽ giúp người dùng dễ hiểu quy trình xử lý của chương trình.

Ví dụ sử dụng Facade Design Patern

Ví dụ để mua được chiệc điện thoại di động, chúng ta cần qua các bước (3 bước) từ xem điện thoại, đặt hàng, rồi thanh toán. Giả sử trong cửa hàng điện thoại có bán rất nhiều hãng điện thoại khác nhau (mỗi hãng là một đối tượng). Để mua một chiếc điện thoại ta trải qua 3 bước trên, mà mỗi bước là một cách xử lý phức tạp. Thay vì ta phải viết code xử lý trong từng đối tượng, thì ta sẽ xử lý trong một class duy nhất và ta chỉ cần biết rằng để mua điện thoại nào đó thì ta sẽ thực hiện qua 3 bước kia mà không quan tâm ba bước kia được xử lý phức tạp ra làm sao.

Hình ảnh minh họa cho ví dụ bên dưới

facade-patern.png

Step 1 : Tạo MobileStore interface

MobileStore.java

    public interface MobileStore {
        public void showMobile();    // xem thông tin sách
        public void orderMobile();   // đặt hàng
        public void pay();         // thanh toán
    }

Step 2 : Tạo class Iphone implements class MobileStore interface

Iphone.java

    public class Iphone implements MobileStore {
        public void showMobile() {
            System.out.println("Đây là điện thoại Iphone 10");
        }
        public void orderMobile() {
            System.out.println("Bạn đã đặt mua chiếc Iphone 10");
        }
        public void pay() {
            System.out.println("Bạn vừa thanh toán chiếc Iphone 10");
        }
    }

Step 3 : Tạo class XiaoMi implements class MobileStore interface

XiaoMi.java

    public class XiaoMi implements MobileStore {
        public void showMobile() {
            System.out.println("Đây là điện thoại XiaoMi 3s");
        }
        public void orderMobile() {
            System.out.println("Bạn đã đặt mua chiếc XiaoMi 3s");
        }
        public void pay() {
            System.out.println("Bạn vừa thanh toán chiếc Iphone 10 ");
        }
    }

Step 4 : Tạo class Samsung implements class MobileStore interface

Samsung.java

    public class Samsung implements MobileStore {
        public void showMobile() {
            System.out.println("Đây là điện thoại Samsung J7 Prime");
        }
        public void orderMobile() {
            System.out.println("Bạn đã đặt mua chiếc Samsung J7 Prime");
        }
        public void pay() {
            System.out.println("Bạn vừa thanh toán chiếc Samsung J7 Prime");
        }
    }

Step 5 : Tạo class MobileStoreKeeper khởi tạo các mặt hàng MobileStoreKeeper.java

    public class MobileStoreKeeper {
        private MobileStore iphone;
        private MobileStore xiaomi;
        private MobileStore sumsung;

        public MobileStoreKeeper {
            iphone = new Iphone();
            xiaomi = new XiaoMi();
            samsung = new Samsung();
        }

        public void iphoneSale() {
            iphone.showMobile();
            iphone.orderMobile();
            iphone.pay();
        }

        public void xiaomiSale() {
            xiaomi.showMobile();
            xiaomi.orderMobile();
            xiaomi.pay();
        }

        public void samsungSale() {
            samsung.showMobile();
            samsung.orderMobile();
            samsung.pay();
        }
    }

Step 6 : Khách hàng sẽ mua điện thoại thông qua shop bán hàng (MobileStoreKeeper)

    public class FacadePaternClient {
        private int choise;
        Scanner sc = new Scanner(System.in);
        MobileStoreKeeper storeKp = new MobileStoreKeeper();
        public static void main(String [] args) throws Exception {
            do {
                System.out.println("Quý khách muốn xem điện thoại nào từ cửa hàng chúng tôi?");
                System.out.println("1. Iphone");
                System.out.println("2. Xiaomi");
                System.out.println("3. Samsung");
                System.out.println("4. Exit");
                System.out.println("Mời quý khách nhập lựa chọn :) ");
                choise = sc.nextInt();
                switch(choise) {
                    case 1: storeKp.iphoneSale();
                    case 2: storeKp.xiaomiSale();
                    case 3: storeKp.samsungSale();
                    default:
                        System.out.println("Mời quý khách xem thêm các mẫu trong cửa hàng.");
                }
            } while(choise!=4);
        }
    }

Tổng kết

Vậy là mình vừa trình bày về mẫu thiết kế Facade Design Patern. Ví dụ trong bài viết dựa theo những gì mình đã làm trong bài tập lớn môn "Kiến trúc và thiết kế phần mềm", đề bài quản lý BookStore (mình biến tấu sang Mobile Store 😄).

Hi vọng bài viết hữu ích và mọi người sẽ có những lựa chọn hợp lý cho kiến trúc thiết kế của mình.

Thanks for watching!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí