Java設(shè)計模式中的門面模式詳解
門面模式
概述
門面模式(Facade Pattern)又叫外觀模式,屬于結(jié)構(gòu)性模式。
它提供一個統(tǒng)一的接口去訪問多個子系統(tǒng)的多個不同的接口,它為子系統(tǒng)中的一組接口提供一個統(tǒng)一的高層接口。使得子系統(tǒng)更容易使用。
客戶端不需要知道系統(tǒng)內(nèi)部的復(fù)雜聯(lián)系,只需定義系統(tǒng)的入口。即在客戶端和復(fù)雜系統(tǒng)之間再加一層,這一層將調(diào)用順序、依賴關(guān)系等處理好。
應(yīng)用場景
為復(fù)雜的模塊或子系統(tǒng)提供外界訪問的模塊。
子系統(tǒng)相對獨立。
預(yù)防額外操作帶來的風(fēng)險。
目的
降低訪問復(fù)雜系統(tǒng)的內(nèi)部子系統(tǒng)時的復(fù)雜度,簡化客戶端之間的接口。
優(yōu)缺點
優(yōu)點:
減少系統(tǒng)相互依賴。
提高靈活性。
提高安全性。
缺點:
不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。也就是說系統(tǒng)可以提供新的功能模塊而不必進(jìn)行修改。
主要角色
門面模式主要包含2種角色:
1.外觀角色(Facade):
外觀角色也稱門面角色,系統(tǒng)對外的統(tǒng)一接口;
2.子系統(tǒng)角色(SubSystem):
可以同時有一個或多個SubSystem。每個SubSytem都不是一個單獨的類,而是一個類的集合。
SubSystem并不知道Facade的存在,對于SubSystem而言,F(xiàn)acade只是另一個客戶端而已(即Facade對SubSystem透明)
門面模式的基本使用
創(chuàng)建子系統(tǒng)角色
創(chuàng)建2個創(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();
/**
* 提供對外接口
*/
public void subSystemA() {
this.a.subSystem();
}
/**
* 提供對外接口
*/
public void subSystemB() {
this.b.subSystem();
}
}
客戶端調(diào)用
public static void main(String[] args) {
Facade facade = new Facade();
facade.subSystemA();
facade.subSystemB();
}
門面模式實現(xiàn)商城下單
如商城系統(tǒng)中的下單,下單過程可能涉及多個模塊子系統(tǒng)的聯(lián)動操作,如果分別發(fā)送網(wǎng)絡(luò)請求各個模塊子系統(tǒng)的接口,會增加一定復(fù)雜度與額外的網(wǎng)絡(luò)請求。
此時可以采取門面模式,將所有相關(guān)接口整合到一個接口中,由后端提供一個接口給前端調(diào)用。
假設(shè)在一個商城系統(tǒng)中,涉及庫存系統(tǒng)、支付系統(tǒng)、物流系統(tǒng)、入口系統(tǒng)。用戶下單時進(jìn)行校驗庫存,驗證支付,最后發(fā)貨這一整個過程串聯(lián)起來,提供一個統(tǒng)一接口供客戶端調(diào)用。
庫存系統(tǒng)
public class StockSys {
/**
* 庫存校驗
*/
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è)計模式中的門面模式詳解的文章就介紹到這了,更多相關(guān)Java門面模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法
本文主要介紹了springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
springboot項目數(shù)據(jù)庫配置類DatabaseConfig示例詳解
這篇文章主要介紹了springboot項目數(shù)據(jù)庫配置類DatabaseConfig實現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
JAVA錯誤:'無效目標(biāo)發(fā)行版?17'的解決方案
這篇文章主要給大家介紹了關(guān)于JAVA錯誤:'無效目標(biāo)發(fā)行版?17'的解決方案,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或使用java具有一的的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-09-09
打開.properties中文顯示unicode編碼問題以及解決
這篇文章主要介紹了打開.properties中文顯示unicode編碼問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

