一起學設計模式 - 外觀模式

外觀模式(Facade Pattern)屬於結構型模式的一種,爲子系統中的一組接口提供一個統一的入口,它通過引入一個外觀角色來簡化客戶端與子系統之間的交互…

概述

外觀模式是一種使用頻率非常高的結構型設計模式,當你要爲一個複雜子系統提供一個簡單接口時。子系統往往因爲不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過Facade層

如下圖:

外觀模式

案例

購物場景中,我們要調用產品(Product)支付(Pay)等服務,這時候面對了多個複雜的業務,怎麼樣通過模式來解決?

購物圖

  1. 創建ProductServicePayService
class ProductService {
    public void pick() {
        System.out.println("挑選小米Mix2尊享版");
    }
}

class PayService {
    public void pay() {
        System.out.println("支付4799元");
    }
}
  1. 定義外觀類FacadeOrder由它統一調用,客戶端無需關心具體實現
class FacadeOrder {

    private ProductService productService;
    private PayService payService;

    public FacadeOrder() {
        this.productService = new ProductService();
        this.payService = new PayService();
    }

    public void buyPhone() {
        this.productService.pick();
        System.out.println("添加購物車");
        this.payService.pay();
    }
}
  1. 創建測試類Client
public class Client {

    public static void main(String[] args) {
        FacadeOrder order = new FacadeOrder();
        order.buyPhone();
    }

}
  1. 運行結果
挑選小米Mix2尊享版
添加購物車
支付4799

總結

細心的朋友會發現,該模式應用其實非常之廣泛,與我們平時寫的DAO->Service->Controller是不是很相像呢

優點

  • 降低了客戶類與子系統類的耦合度,實現了子系統與客戶之間的鬆耦合關係
  • 外觀模式對客戶屏蔽了子系統組件,從而簡化了接口,減少了客戶處理的對象數目並使子系統的使用更加簡單。
  • 客戶程序與抽象類的實現部分之間存在着很大的依賴性,引入Facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。

缺點

  • 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了開閉原則

與適配器模式的區別

適配器模式是將一個對象包裝起來以改變其接口,而外觀模式是將一羣對象包裝起來以簡化其接口。適配器是將接口轉換爲不同接口,而外觀模式是提供一個統一的接口來簡化接口。

- 說點什麼

全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter8/battcn-facade

  • 個人QQ:1837307557
  • battcn開源羣(適合新手):391619659

微信公衆號:battcn(歡迎調戲)

發佈了60 篇原創文章 · 獲贊 19 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章