作過電商系統的小夥伴應該知道,用戶購買一個東西以後,系統須要作的操做包括支付收費 、生成訂單,扣除庫存等幾個操做。若是不使用門面模式那是怎樣的呢?那咱們得分別爲支付收費、生成訂單,扣除庫存這幾個動做提供接口,讓用戶一個一個去調。使用門面模式就是咱們提供一個統一的接口,咱們來處理這幾個動做,用戶只要知道調了這個接口就能下單,購買到東西,並不須要去了解其中完成多少個步驟,有多少個子系統參與。編程
這麼一說,你是否是已經一直在使用門面模式,只是你本身並無意識到你在使用它?雖然簡單,也一直已經在使用,仍是有必要探究一下它的細節以及注意點。安全
定義(百度百科):門面模式,是指提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。
bash
這個定義能夠說是很是清晰了,基本上每一個字都認識,放在一塊兒應該也能理解它的意思吧?【呵呵】markdown
要點:spa
一、提供統一的接口,用於訪問多個子系統。code
涉及到的角色orm
(1)、門面類(Facade),提供一個統一的接口給客戶端調用接口
(2)、各類子系統:OrderSystem、ProductSystem、PaySystem。it
代碼實現以下,基本沒什麼可說的,直接按照UML圖,編寫代碼便可。io
(一)、各類系統服務:訂單系統、支付系統、庫存系統。
package com.facade; public class OrderSystem { public void createOrder(){ System.out.println("建立一個新的訂單!!!"); } }複製代碼
package com.facade; public class PaySystem { public void pay(){ System.out.println("支付:支付完成!!!"); } }複製代碼
package com.facade; public class ProductSystem { public void deProductCount(){ System.out.println("扣減庫存!!!"); } } 複製代碼
(二)、門面類,提供一個統一的入口,讓客戶端調用
package com.facade; public class Facade { private PaySystem paySystem; private OrderSystem orderSystem; private ProductSystem productSystem; public Facade(){ paySystem = new PaySystem(); orderSystem = new OrderSystem(); productSystem = new ProductSystem(); } public void buyABook(){ paySystem.pay(); orderSystem.createOrder(); productSystem.deProductCount(); } } 複製代碼
(三)、調用
package com.facade;
public class TestMain {
public static void main(String[] args) {
Facade facade = new Facade();
facade.buyABook();
}
}
複製代碼
(四)、執行結果
門面模式(外觀模式):提供一個統一接口,集中多個子系統,多個接口方法,提供服務。如編程中MVC模式,C(Controller)即爲門面,提供統一入口、M(Model)即提供各類系統服務。
優點:
一、對客戶端友好,有統一的入口提供給客戶端。
二、對服務調用跟容易管理記錄,也更安全。能夠想象咱們提供一個購物接口確定比讓客戶端本身去調建立訂單、減小庫存、支付更安全,若是客戶端忘了調某個服務,就會出現問題。
缺點:
一、門面類耦合了各類服務,較爲複雜,容易出錯。