Java設(shè)計(jì)模式中的門(mén)面模式詳解
門(mén)面模式
概述
門(mén)面模式(Facade Pattern)又叫外觀模式,屬于結(jié)構(gòu)性模式。
它提供一個(gè)統(tǒng)一的接口去訪問(wèn)多個(gè)子系統(tǒng)的多個(gè)不同的接口,它為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的高層接口。使得子系統(tǒng)更容易使用。
客戶端不需要知道系統(tǒng)內(nèi)部的復(fù)雜聯(lián)系,只需定義系統(tǒng)的入口。即在客戶端和復(fù)雜系統(tǒng)之間再加一層,這一層將調(diào)用順序、依賴關(guān)系等處理好。
應(yīng)用場(chǎng)景
為復(fù)雜的模塊或子系統(tǒng)提供外界訪問(wèn)的模塊。
子系統(tǒng)相對(duì)獨(dú)立。
預(yù)防額外操作帶來(lái)的風(fēng)險(xiǎn)。
目的
降低訪問(wèn)復(fù)雜系統(tǒng)的內(nèi)部子系統(tǒng)時(shí)的復(fù)雜度,簡(jiǎn)化客戶端之間的接口。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
減少系統(tǒng)相互依賴。
提高靈活性。
提高安全性。
缺點(diǎn):
不符合開(kāi)閉原則,如果要改東西很麻煩,繼承重寫(xiě)都不合適。也就是說(shuō)系統(tǒng)可以提供新的功能模塊而不必進(jìn)行修改。
主要角色
門(mén)面模式主要包含2種角色:
1.外觀角色(Facade):
外觀角色也稱門(mén)面角色,系統(tǒng)對(duì)外的統(tǒng)一接口;
2.子系統(tǒng)角色(SubSystem):
可以同時(shí)有一個(gè)或多個(gè)SubSystem。每個(gè)SubSytem都不是一個(gè)單獨(dú)的類,而是一個(gè)類的集合。
SubSystem并不知道Facade的存在,對(duì)于SubSystem而言,F(xiàn)acade只是另一個(gè)客戶端而已(即Facade對(duì)SubSystem透明)
門(mén)面模式的基本使用
創(chuàng)建子系統(tǒng)角色
創(chuàng)建2個(gè)創(chuàng)建子系統(tǒng)角色:SubSystemA 與SubSystemB
public class SubSystemA { public void subSystem() { System.out.println("subSystem A"); } }
public class SubSystemB { public void subSystem() { System.out.println("subSystem B"); } }
創(chuàng)建外觀角色
public class Facade { private SubSystemA a = new SubSystemA(); private SubSystemB b = new SubSystemB(); /** * 提供對(duì)外接口 */ public void subSystemA() { this.a.subSystem(); } /** * 提供對(duì)外接口 */ public void subSystemB() { this.b.subSystem(); } }
客戶端調(diào)用
public static void main(String[] args) { Facade facade = new Facade(); facade.subSystemA(); facade.subSystemB(); }
門(mén)面模式實(shí)現(xiàn)商城下單
如商城系統(tǒng)中的下單,下單過(guò)程可能涉及多個(gè)模塊子系統(tǒng)的聯(lián)動(dòng)操作,如果分別發(fā)送網(wǎng)絡(luò)請(qǐng)求各個(gè)模塊子系統(tǒng)的接口,會(huì)增加一定復(fù)雜度與額外的網(wǎng)絡(luò)請(qǐng)求。
此時(shí)可以采取門(mén)面模式,將所有相關(guān)接口整合到一個(gè)接口中,由后端提供一個(gè)接口給前端調(diào)用。
假設(shè)在一個(gè)商城系統(tǒng)中,涉及庫(kù)存系統(tǒng)、支付系統(tǒng)、物流系統(tǒng)、入口系統(tǒng)。用戶下單時(shí)進(jìn)行校驗(yàn)庫(kù)存,驗(yàn)證支付,最后發(fā)貨這一整個(gè)過(guò)程串聯(lián)起來(lái),提供一個(gè)統(tǒng)一接口供客戶端調(diào)用。
庫(kù)存系統(tǒng)
public class StockSys { /** * 庫(kù)存校驗(yàn) */ public Boolean verify(){ if (Math.random()*10 >5) { System.out.println("StockSys verify success"); return true; } System.out.println("StockSys verify fail"); return false; } }
支付系統(tǒng)
public class PaySys { /** * 支付 */ public Boolean pay() { if (Math.random()*10 >2) { System.out.println("PaySys pay success"); return true; } System.out.println("PaySys pay fail"); return false; } }
物流系統(tǒng)
public class LogisticsSys { /** * 發(fā)貨 */ public void ship() { System.out.println("logistics ship"); } }
入口系統(tǒng)
public class MySys { StockSys stockSys = new StockSys(); PaySys paySys = new PaySys(); LogisticsSys logisticsSys = new LogisticsSys(); public void order() { if (stockSys.verify()) { if (paySys.pay()) { logisticsSys.ship(); } } } }
客戶端調(diào)用
public static void main(String[] args) { new MySys().order(); }
StockSys verify success
PaySys pay success
logistics shipStockSys verify fail
StockSys verify success
PaySys pay fail
到此這篇關(guān)于Java設(shè)計(jì)模式中的門(mén)面模式詳解的文章就介紹到這了,更多相關(guān)Java門(mén)面模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java concurrency之AtomicLongArray原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java concurrency之AtomicLongArray原子類的相關(guān)知識(shí),感興趣的朋友參考下吧2017-06-06SpringBoot2.0整合Redis自定義注入bean組件配置的實(shí)戰(zhàn)教程
這篇文章主要介紹了SpringBoot2.0整合Redis自定義注入bean組件配置,我們將基于SpringBoot2.0整合搭建的微服務(wù)項(xiàng)目為奠基,開(kāi)啟中間件Redis的實(shí)戰(zhàn)之路,需要的朋友可以參考下2023-06-06如何把spring boot應(yīng)用發(fā)布到Harbor
這篇文章主要介紹了如何把spring boot應(yīng)用發(fā)布到Harbor,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程)
這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程),需要的朋友可以參考下2021-04-04Mybatis動(dòng)態(tài)SQL foreach標(biāo)簽用法實(shí)例
這篇文章主要介紹了Mybatis動(dòng)態(tài)SQL foreach標(biāo)簽用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10SpringDataJpa:JpaRepository增刪改查操作
這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Security CsrfFilter過(guò)濾器用法實(shí)例
這篇文章主要介紹了Spring Security CsrfFilter過(guò)濾器用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11基于Java匯總Spock框架Mock靜態(tài)資源經(jīng)驗(yàn)
這篇文章主要介紹了基于Java匯總Spock框架Mock靜態(tài)資源經(jīng)驗(yàn),前面講了?Spock框架Mock對(duì)象、方法經(jīng)驗(yàn)總結(jié),今天分享一下Spock框架中Mock靜態(tài)資源的實(shí)踐經(jīng)驗(yàn)匯總。分成靜態(tài)資源和混合場(chǎng)景,需要的朋友可以參考一下2022-02-02