個人學習筆記分享浑玛,當前能力有限顾彰,請勿貶低胃碾,菜鳥互學,大佬繞道
如有勘誤厕隧,歡迎指出和討論,本文后期也會進行修正和補充
前言
生活中吁讨,如果有什么事需要去營業(yè)廳等站點辦理,我們希望的是給接待員需要的信息排龄,然后他們?nèi)マk理完成翎朱,走人!
然而有些時候拴曲,我們得到的回應(yīng)是我們需要先做什么,再做什么兑障,再去哪做什么blablabla....
后者一看就不專業(yè)是不是蕉汪?做個事你們做不就得了嗎,不然我來營業(yè)廳干嘛福澡?掏出手機百度一下不就得了?
作為專業(yè)的程序猿革砸,那我們寫的代碼肯定得專業(yè)一些糯累。
對于一個系統(tǒng),我們隱藏其內(nèi)部細節(jié)效拭,并向外部提供訪問接口胖秒,進而達到隱藏復雜性的目的。
說白了阎肝,客戶告訴我們有啥事,我們內(nèi)部辦好判导,至于細節(jié)不需要告知客戶,保證事情辦好就成骡楼。
外觀(Facade)模式又叫作門面模式,是一種通過為多個復雜的子系統(tǒng)提供一個一致的接口引镊,而使這些子系統(tǒng)更加容易被訪問的模式。
該模式對外有一個統(tǒng)一接口弟头,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體細節(jié)赴恨,這樣會大大降低應(yīng)用程序的復雜度伴栓,提高了程序的可維護性。
其實我們一直都在有意無意的大量使用外觀模式——高層模塊需要調(diào)度多個子系統(tǒng)時钳垮,定義一個新的類封裝這些子系統(tǒng),并向外提供精簡的接口以供訪問歧焦。
1.介紹
使用目的:為子系統(tǒng)中的一組接口提供一個一致的界面肚医,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用舰涌。
使用時機:定義整個系統(tǒng)的入口你稚,而客戶端并不需要知道系統(tǒng)內(nèi)部的復雜聯(lián)系,僅需要一個“接待者”即可
解決問題:降低訪問復雜系統(tǒng)的內(nèi)部子系統(tǒng)時的復雜度入宦,簡化客戶端與之的接口
實現(xiàn)方法:定義一個類乾闰,封裝子系統(tǒng)涯肩,并向客戶端提供一個接口以供訪問
應(yīng)用實例:
-
MVC
中的view-controller-service-dao
層次結(jié)構(gòu)轿钠,高層系統(tǒng)都只知道下一層系統(tǒng)的接口疗垛,并不知道其細節(jié)及其子系統(tǒng) - 第三方sdk或者庫通常都會提供統(tǒng)一的接口硫朦,并不會暴露內(nèi)部的邏輯細節(jié)
優(yōu)點:
- 減少系統(tǒng)相互依賴,降低耦合度咬展,提高靈活性
- 隱藏系統(tǒng)內(nèi)部細節(jié),減少了客戶需要處理的信息破婆,使得子系統(tǒng)的使用更加方便
- 外部不知道系統(tǒng)的內(nèi)部細節(jié),因此也就更加安全
缺點:增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼瀑梗,繼承重寫都不合適裳扯,違背了“開閉原則”
2.結(jié)構(gòu)
通常包括三個角色:
- 外觀(Facade)角色:為多個子系統(tǒng)對外提供一個共同的接口。
- 子系統(tǒng)(Sub System)角色:實現(xiàn)系統(tǒng)的部分功能铺纽,客戶可以通過外觀角色訪問它哟忍。
- 客戶(Client)角色:通過一個外觀角色訪問其提供的子系統(tǒng)功能锅很。
- 客戶端(
Client
)調(diào)用Facade
中的接口 -
Facade
持有多個SubSystem
對象,通過調(diào)用其方法叛复,提供接口給外部使用 -
Client
并不需要訪問多個SubSystem
扔仓,而是通過Facede
作為中間人,即可使用多個SubSystem
的功能
3.實現(xiàn)
-
定義子系統(tǒng)角色
class SubSystemA { public void doA() { System.out.println("子系統(tǒng)A被調(diào)用"); } } class SubSystemB { public void doB() { System.out.println("子系統(tǒng)B被調(diào)用"); } }
-
定義外觀角色
class Facade { private SubSystemA subSystemA; private SubSystemB subSystemB; public Facade() { this.subSystemA = new SubSystemA(); this.subSystemB = new SubSystemB(); } public void doA() { subSystemA.doA(); } public void doB() { subSystemB.doB(); } }
-
測試客戶端
public class FacadeTest { public static void main(String[] args) { Facade facade = new Facade(); facade.doA(); facade.doB(); } }
完整代碼
package com.company.test.facade;
class SubSystemA {
public void doA() {
System.out.println("子系統(tǒng)A被調(diào)用");
}
}
class SubSystemB {
public void doB() {
System.out.println("子系統(tǒng)B被調(diào)用");
}
}
class Facade {
private SubSystemA subSystemA;
private SubSystemB subSystemB;
public Facade() {
this.subSystemA = new SubSystemA();
this.subSystemB = new SubSystemB();
}
public void doA() {
subSystemA.doA();
}
public void doB() {
subSystemB.doB();
}
}
public class FacadeTest {
public static void main(String[] args) {
Facade facade = new Facade();
facade.doA();
facade.doB();
}
}
運行結(jié)果
后記
想了想確實沒啥好說的,作為后端程序猿mvc
的view-controller-serivce-dao
模式再熟悉不過了呜笑,應(yīng)該早已養(yǎng)成了這種模式的習慣
其實也是Java的核心思想之一,即封裝叫胁。將方法封裝起來并隱藏細節(jié),只提供給外部接口以便使用微谓。
作者:Echo_Ye
WX:Echo_YeZ
Email :echo_yezi@qq.com
個人站點:在搭了在搭了谤民。。触创。(右鍵 - 新建文件夾)