一、引言
電商項目中一個常見場景:送出訂單操作,送出訂單後有很多後續動作,例如:檢查訂單, 建立訂單, 減庫存,建立支付連結等等,這些子類的内部操作都很複雜。如果我們的用戶端程式要直接跟這些内容子系統進行耦合,那麼用戶端就得随着子系統的改動而改動。送出訂單操作在一個電商系統中很多地方都會出現,如果每個地方都進行了耦合,那一旦進行改動是非常苦難的。
這個時候我們需要一個進階接口,将子系統包裝起來,提供一個用戶端可以通路系統的接口,将内部系統的複雜性隐藏起來,這就是外觀模式。
二、外觀模式
定義:外觀模式提供了一個統一的接口,用來通路子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。
主要解決:降低通路複雜系統的内部子系統時的複雜度,簡化用戶端與之的接口。
何時使用: 1、用戶端不需要知道系統内部的複雜聯系,整個系統隻需提供一個"接待員"即可。 2、定義系統的入口。
如何解決:用戶端不與系統耦合,外觀類與系統耦合。
類圖:
三、代碼實作
//檢查訂單
public class CheckOrder {
public void check() {
System.out.println("檢查訂單...");
}
}
//建立訂單
public class AddOrder {
public void add(){
System.out.println("新增訂單...");
}
}
//減庫存
public class SubInventory {
public void sub(){
System.out.println("減去庫存...");
}
}
//下單外觀類
public class OrderFacade {
private AddOrder addOrder;
private CheckOrder checkOrder;
private SubInventory subInventory;
public OrderFacade(){
addOrder=new AddOrder();
checkOrder=new CheckOrder();
subInventory=new SubInventory();
}
//入口方法
public void order(){
checkOrder.check();
addOrder.add();
subInventory.sub();
}
}
結果:
四、總結
優點: 1、減少系統互相依賴。 2、提高靈活性。 3、提高了安全性。
缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合适。
使用場景: 1、為複雜的子產品或子系統提供外界通路的子產品。 2、子系統相對獨立。 3、預防低水準人員帶來的風險。
注意事項:在階層化結構中,可以使用外觀模式定義系統中每一層的入口
為幫助開發者們提升面試技能、有機會入職BATJ等大廠公司,特别制作了這個專輯——這一次整體放出。
大緻内容包括了: Java 集合、JVM、多線程、并發程式設計、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大廠面試題等、等技術棧!
歡迎大家關注頭條【java研習社】,回複【111】,擷取以上最新Java後端架構VIP學習資料以及視訊學習教程,然後一起學習,一文在手,面試我有。
每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!