外觀模式(Facade Pattern)
屬於結構型模式
的一種,爲子系統中的一組接口提供一個統一的入口,它通過引入一個外觀角色
來簡化客戶端與子系統之間的交互…
概述
外觀模式是一種使用頻率非常高的結構型設計模式,當你要爲一個複雜子系統提供一個簡單接口時。子系統往往因爲不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過Facade層
如下圖:
案例
購物場景中,我們要調用產品(Product)
和支付(Pay)
等服務,這時候面對了多個複雜的業務,怎麼樣通過模式來解決?
- 創建
ProductService
和PayService
class ProductService {
public void pick() {
System.out.println("挑選小米Mix2尊享版");
}
}
class PayService {
public void pay() {
System.out.println("支付4799元");
}
}
- 定義外觀類
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();
}
}
- 創建測試類
Client
public class Client {
public static void main(String[] args) {
FacadeOrder order = new FacadeOrder();
order.buyPhone();
}
}
- 運行結果
挑選小米Mix2尊享版
添加購物車
支付4799元
總結
細心的朋友會發現,該模式應用其實非常之廣泛,與我們平時寫的DAO->Service->Controller
是不是很相像呢
優點
- 降低了客戶類與子系統類的耦合度,實現了子系統與客戶之間的鬆耦合關係
外觀模式
對客戶屏蔽了子系統組件,從而簡化了接口,減少了客戶處理的對象數目並使子系統的使用更加簡單。- 客戶程序與抽象類的實現部分之間存在着很大的依賴性,引入
Facade
將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
缺點
- 在不引入
抽象外觀類
的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了開閉原則
與適配器模式的區別
適配器模式
是將一個對象包裝起來以改變其接口,而外觀模式
是將一羣對象包裝起來以簡化其接口。適配器是將接口轉換爲不同接口,而外觀模式是提供一個統一的接口來簡化接口。
- 說點什麼
全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter8/battcn-facade
- 個人QQ:1837307557
- battcn開源羣(適合新手):391619659
微信公衆號:battcn
(歡迎調戲)