【設計模式】只需體驗三分鐘,你就會跟我一樣瞭解Facade和Mediator模式
theme: fancy
Facade 門面模式
模擬場景
現有Client
一枚,需要在城裡落戶,要轉戶口,現在有關部門要求Client
準備一系列的材料。
我們精簡一下部門,假設只需要跑材料部門
、核驗蓋章部門
和制證發證部門
三個部門就行了。
現在需要Client
先去材料部門
領取材料,然後填寫完成後到核驗部門蓋章
,最後拿著蓋著的材料去制證部門
領證,這樣一套按照順序走下來,業務才能算完成。
程式碼模擬
材料部門
java
/**
* 材料部門,給辦證者提供必要的材料
* @author 行百里者
*/
public class StuffDept {
public void makeStuff() {
//處理業務邏輯
System.out.println("製作相關材料,併發給Client填寫");
}
}
蓋章部門
java
/**
* 檢查核驗部門,核驗通過才給蓋章
* @author 行百里者
*/
public class CheckDept {
public void checkStuff() {
//處理業務邏輯
System.out.println("核查材料的準確性,核查通過才給蓋章");
}
}
制證部門
java
/**
* 發證部門
* @author 行百里者
*/
public class IssueDept {
public void issueCert() {
//處理業務邏輯
System.out.println("發證部門檢驗材料是否蓋章,然後制證發證");
}
}
需要辦證的Client
處理場景:
java
public class Client {
public static void main(String[] args) {
//一定要按照這個順序去辦證,否則拿不到證
StuffDept sd = new StuffDept();
sd.makeStuff();
CheckDept cd = new CheckDept();
cd.checkStuff();
IssueDept id = new IssueDept();
id.issueCert();
}
}
其實,現實生活中,我們可能遠不止跑這三個部門,如果Client
來回穿梭於N個部門間,辦事效率是不是很垃圾了!
用門面模式解決這一疑難雜症
好在現在很多地方提供了網上通道辦理一些業務,Client
只需要跑一次就可以了,Client
只需要和網上通道
-NetApp
打交道就可以了。
```java /* * “中國式辦證”所需的“門面”部門,負責統一處理各部門的事情, * Client只需要調“門面”的doItJustOnce方法即可 * @author 行百里者 / public class NetApp { private StuffDept stuffDept = new StuffDept(); private CheckDept checkDept = new CheckDept(); private IssueDept issueDept = new IssueDept();
public void doItJustOnce() {
stuffDept.makeStuff();
checkDept.checkStuff();
issueDept.issueCert();
}
} ```
Client
調起
public class Client {
public static void main(String[] args) {
NetApp facade = new NetApp();
facade.doItJustOnce();
}
}
對於Client
來說,是不是就清爽了!
這不就是再封裝了一層嗎?沒錯,這就是 門面模式 ,解決了Client
向各個部門內部呼叫,並且按照指定的順序呼叫這一繁瑣的問題。
似曾相識的Facade
支付寶支付API
接入方只管呼叫,不管它的內部怎樣實現的,只需要根據其開放的API進行資料互動。
支付寶開放API就可以理解為是Facade模式的應用。
日誌框架SLF4J
SLF4J 日誌框架採用的就是門面設計模式,對外隱藏系統內部的複雜性,並向外部呼叫的客戶端或程式提供統一的介面。
```java private static final Logger LOGGER = LoggerFactory.getLogger(Provider.class);
public String doSomething() { LOGGER.info("service name:{}", serviceName); } ```
一句話就可以直接輸出日誌資訊,而不管其內部是Log4j實現的還是logback實現的,用起來就是簡單明瞭。
JDBC資料庫操作
資料庫JDBC的操作,例如:
```java @Component public class DBUtil {
private static String URL;
private static String DRIVER;
private static String USERNAME;
private static String PASSWORD;
private static Connection connection = null;
private static final Logger LOGGER = LoggerFactory.getLogger(DBUtil.class);
/**
* 獲取JDBC連線
*
*/
public static Connection getConnection() {
try {
//載入驅動程式:它通過反射建立一個driver物件。
Class.forName(DRIVER);
//獲得資料連線物件。
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
return connection;
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("獲取JDBC連線異常, {}", e.getMessage());
}
return null;
}
@Value("${db.dburl}")
public void setURL(String dburl) {
URL = dburl;
}
@Value("${db.dbdriver}")
public void setDRIVER(String dbdriver) {
DRIVER = dbdriver;
}
@Value("${db.dbusername}")
public void setUSERNAME(String dbusername) {
USERNAME = dbusername;
}
@Value("${db.dbpassword}")
public void setPASSWORD(String dbpassword) {
PASSWORD = dbpassword;
}
}
```
獲取資料庫連線的時候,只需要傳入driver的驅動類名稱即可,如果以後我們更換Class.forName中的 driver 非常方便,比如從MySQL資料庫換到Oracle資料庫,只要更換facade中的driver就可以。
Mediator 調停者模式
有的地方把它叫做中介者模式
,名字不重要!!!
張三的煩惱
張三的老婆發現他最近有點異常,懷疑張三和他前女友藕斷絲連,於是張老婆去找張三他媽評理,但是倆人很快吵起來了,此時小姑子出現了,又是一頓吵,是互相吵的那種。
張三惱了,和其他三人也吵起來了。
他很想結束現狀,但是他已無能為力,甚至自己也陷入其中,要是居委會大媽
在就好了!!!
居委會大媽
的職責就是協調他們內部的事情,有什麼事直接跟我說,保證把你們的事情都解決!!!
居委會大媽
就是調停者,中介者。
模擬現場
加入了一箇中介者作為四個模組的交流核心,每個模組之間不再相互交流,要交流就通過中介者居委會大媽
進行。每個模組只負責自己的業務邏輯,不屬於自己的則丟給中介者來處理,簡化了各模組之間的耦合關係。
訊息中介軟體
臥槽,中介處理各個模組的需求,而且各個模組之間不需要通訊,訊息中介軟體不就是這種模式嗎?
對!MQ就可以理解為Mediator模式
。
調停者模式的優缺點
-
優點
中介者模式的優點就是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,減少了依賴,當然同時也降低了類間的耦合。
-
缺點
中介者模式的缺點就是中介者會膨脹得很大,而且邏輯複雜,,中介者的邏輯就越複雜。
好了,你已經會門面模式
和調停者模式
了。下一個!!!
- 我正在參與掘金技術社群創作者簽約計劃招募活動,點選連結報名投稿。
- Java最強大的技術之一:反射
- 【設計模式】通過一個簡單的案例理解-訪問者模式(Visitor Pattern)
- 【設計模式】模板模式,學會它咱也寫出優雅健壯的程式碼!
- 【設計模式】通俗易懂版責任鏈模式
- 【設計模式】代理模式那些事兒:靜態代理,動態代理,JDK的動態代理,cglib,Spring AOP
- 萬字長文 | Spring Cloud Alibaba元件之Nacos實戰及Nacos客戶端服務註冊原始碼解析
- 【設計模式】只需體驗三分鐘,你就會跟我一樣瞭解Facade和Mediator模式
- 【設計模式】工廠系列-FactoryMethod,AbstractFactory,Spring IOC
- 【資料結構】| 連結串列資料結構及其簡單玩法解析
- 系統架構演進與Spring Cloud Alibaba簡介
- 【FastDFS】一文學會一個分散式檔案系統!
- 【MySQL 8】MySQL 5.7都即將停只維護了,是時候學習一波MySQL 8了!
- 使用Rancher部署管理K8S叢集,真香!
- 玩轉Docker映象倉庫-Docker Registry及Harbor
- 【設計模式】各個擊破單例模式的8種寫法
- 容器化技術之Docker-從入地到上天
- 【RocketMQ】RocketMQ叢集,RocketMQ-on-DLedger可容災叢集
- 【RocketMQ】基於RocketMQ的分散式事務
- 【RocketMQ】近距離感受RocketMQ如何收發訊息,有備而來!
- 【RocketMQ】RocketMQ入門之閃電三連鞭:訊息佇列、RocketMQ介紹及安裝使用