摘要:定義與類型定義又叫門面模式,提供了一個統一的接口,用來訪問子系統中的一群接口外觀模式定義了一個高層接口,讓子系統更容易使用類型結構型類圖門面模式是對系統復雜的關系處理做了一個封裝,對外提供一個簡單的接口,成員介紹子系統被門面模式封裝的子系統
0x01.定義與類型
定義:又叫門面模式,提供了一個統一的接口,用來訪問子系統中的一群接口
外觀模式定義了一個高層接口,讓子系統更容易使用
類型:結構型
UML類圖
門面模式是對系統復雜的關系處理做了一個封裝,對外提供一個簡單的接口,成員介紹:
子系統:被門面模式封裝的子系統,也是具體業務邏輯的細節
facade類:門面類,對子系統執行流程進行封裝,對外開放功能接口,一般為單例對象。
0x02.適用場景子系統越來越復雜,增加外觀模式提供簡單調用接口
構建多層系統結構,利用外觀對象作為每層的入口,簡化層間調用
0x03.優點簡化了調用過程,無需了解深入子系統,防止帶來風險
減少系統依賴、松散耦合
更好的劃分訪問層次
符合迪米特法則,即最少知道原則
0x04.缺點增加子系統,需要修改門面類,容易引入風險。
修改門面類,不符合開閉原則
0x05.樣例代碼場景:假設積分兌換物品流程,一共有三部分別依賴三個子系統
1.積分校驗系統,查看是否有資格。
2.積分支付系統,兌換禮物,扣減積分等。
3.物流系統,兌換禮物后,進行配送流程。
如果不適用門面模式,需要在客戶端進行三個步驟的調用,而門面封裝后只需要使用門面類,下面具體代碼實現:
/** * 禮物實體類 */ public class PointsGift { private String name; public PointsGift(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * 支付子系統 */ public class PointsPaymentService { public boolean pay(PointsGift pointsGift) { //扣減積分 System.out.println("支付:" + pointsGift.getName() + " 積分成功!"); return true; } } /** * 積分校驗子系統 */ public class QualifyService { public boolean isAvailable (PointsGift pointsGift) { System.out.println("校驗" + pointsGift.getName() + "積分資格通過,庫存通過"); return true; } } /** * 物流子系統 */ public class ShippingService { public String shipGift (PointsGift pointsGift) { //物流系統的對接邏輯 System.out.println(pointsGift.getName() + "進入物流系統"); return "666"; } } /** * 扣減積分門面類 */ public class GiftExchangeService { /** * 模擬注入 */ private QualifyService qualifyService = new QualifyService(); private PointsPaymentService pointsPaymentService = new PointsPaymentService(); private ShippingService shippingService = new ShippingService(); //模擬注入,一開始就已經有了三個依賴的子系統 // public void setQualifyService(QualifyService qualifyService) { // this.qualifyService = qualifyService; // } // // public void setPointsPaymentService(PointsPaymentService pointsPaymentService) { // this.pointsPaymentService = pointsPaymentService; // } // // public void setShippingService(ShippingService shippingService) { // this.shippingService = shippingService; // } public void giftExchange (PointsGift pointsGift) { if (qualifyService.isAvailable(pointsGift)) { //資格校驗通過 if (pointsPaymentService.pay(pointsGift)) { //如果支付積分成功 String shippingOrderNo = shippingService.shipGift(pointsGift); System.out.println("物流訂單號:" + shippingOrderNo); } } } }
測試與調用類
/** * 客戶端與測試類 */ public class Test { public static void main(String[] args) { PointsGift pointsGift = new PointsGift("連衣裙"); GiftExchangeService giftExchangeService = new GiftExchangeService(); // giftExchangeService.setQualifyService(new QualifyService()); // giftExchangeService.setPointsPaymentService(new PointsPaymentService()); // giftExchangeService.setShippingService(new ShippingService()); giftExchangeService.giftExchange(pointsGift); } }
測試輸出結果:
校驗連衣裙積分資格通過,庫存通過 支付:連衣裙 積分成功! 連衣裙進入物流系統 物流訂單號:666
樣例UML
0x06.相關的設計模式
外觀模式和中介者模式
外觀模式關注的是外界和子系統直接的交互
中介者模式關注的是子系統之間的交互
外觀模式和單例模式
外觀模式中外觀對象可以做成單例對象來使用
外觀模式和抽象工廠模式
外觀類可以通過抽象工廠獲取子系統實例
子系統可以在內部對外觀類進行屏蔽
0x07.源碼中的外觀模式SpringJDBC中的:JdbcUtils是對JDBC的封裝
MyBatis: Configuration中new開頭的方法
Tomcat: RequestFacade類
Tomcat: Request類
Tomcat: ResponseFacade類
Tomcat: StandardSessionFacade類
0x08.代碼地址門面模式: https://github.com/sigmako/design-pattern/tree/master/facade
0x09.參考慕課網設計模式精講: https://coding.imooc.com/class/270.html
門面模式: https://www.cnblogs.com/skywang/articles/1375447.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75321.html
摘要:門面模式提供一個高層次的接口,使得子系統更易于使用。適配器模式和門面模式區別適配器模式和門面模式區別適配器模式主要做接口轉換,解決的是原接口和目標接口不匹配的問題。1、什么是門面模式?Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface...
摘要:本回內容介紹上一回聊到工廠模式,略抽象。官方說法,門面模式是指提供一個統一的接口去訪問多個子系統的多個不同的接口,為子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。 本回內容介紹 上一回聊到工廠模式,略抽象。介一回,咱聊門面模式就比較容易了,門面模式也叫外觀模式(facade)。官方說法,門面模式是指提供一個統一的接口去訪問多個子系統的多個不同的接口,為子系統中的一組接...
摘要:能夠協調調用者和被調用者,能夠在一定程度上降低系統的耦合性。特點低耦合性,獨立性好,安全性應用客戶訪問不到或者被訪問者希望隱藏自己,所以通過代理來訪問自己。 我們接著上面的幾種模式繼續講: 4、組合模式 將對象組合成樹形結構表示部分-整體的層次結構。 特點:靈活性強 應用:對象的部分-整體的層次結構,模糊組合對象和簡單對象處理問題 代碼實現 /** 組合模式* *///繼承模式clas...
摘要:簡單的門面模式實例事件綁定函數門面模式的作用是將復雜的接口進行包裝,變成一個便于使用的接口。還是以事件相關為例,事件綁定中還有兩個常用的分別是和。 門面模式是什么,與其我去用笨拙的語言去解釋,不如看下面這張圖,曾經在網上很火的一張圖片,說的是一位兒子為他的爸媽設置的電腦桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了這些起好名字...
閱讀 2942·2023-04-26 01:32
閱讀 1541·2021-09-13 10:37
閱讀 2278·2019-08-30 15:56
閱讀 1669·2019-08-30 14:00
閱讀 3042·2019-08-30 12:44
閱讀 1961·2019-08-26 12:20
閱讀 1056·2019-08-23 16:29
閱讀 3227·2019-08-23 14:44