java設(shè)計(jì)模式之外觀模式(Facade)
概述
外部與內(nèi)部子系統(tǒng)通信時(shí)必須通過的一個(gè)統(tǒng)一的外觀模式對(duì)象進(jìn)行,就是外觀模式,也稱門面模式。一般而言,F(xiàn)acade模式是為了降低客戶端與實(shí)現(xiàn)化層之間的依賴性。外觀模式的用意是為子系統(tǒng)提供一個(gè)集中化和簡(jiǎn)化的溝通渠道。
UML類圖
在上面的UML圖中,出現(xiàn)三個(gè)角色:
客戶端角色(Client):用戶通過客戶端來調(diào)用外觀模式的類,從而來操作子系統(tǒng);
外觀角色(Facade):客戶端可以調(diào)用這個(gè)類,此類中包含了調(diào)用子系統(tǒng)中具體的功能;
子系統(tǒng)角色(Module):定義了子系統(tǒng)中具體的單個(gè)功能;
代碼示例:
package interview; class ModuleA { public void testA(){ System.out.println("ModuleA 中的方法"); } } class ModuleB { public void testB(){ System.out.println("ModuleB 中的方法"); } } class ModuleC { public void testC(){ System.out.println("ModuleC 中的方法"); } } class Facade{ public void testA(){ ModuleA moduleA = new ModuleA(); moduleA.testA(); } public void testB(){ ModuleB moduleB = new ModuleB(); moduleB.testB(); } public void testC(){ ModuleC moduleC = new ModuleC(); moduleC.testC(); } } public class MainTest { public static void main(String arg[]) { Facade facade = new Facade(); facade.testA(); facade.testB(); facade.testC(); } }
上述代碼中Facade類充當(dāng)了ModuleA ,ModuleB,ModuleC模塊的外觀界面,通過這個(gè)類,客戶端不需要親自調(diào)用子系統(tǒng)的ABC模塊,也不需要知道系統(tǒng)內(nèi)部的細(xì)節(jié),從而更好的實(shí)現(xiàn)了客戶端與系統(tǒng)的解耦。
同時(shí),使用外觀模式,還可以選擇性的暴露方法,一個(gè)模塊中定義的方法可以分成兩部分,一部分是給子系統(tǒng)外部使用的,一部分是子系統(tǒng)內(nèi)部模塊之間相互調(diào)用時(shí)使用的。
外觀模式的優(yōu)點(diǎn)
外觀模式松散了客戶端與子系統(tǒng)的耦合關(guān)系,讓子系統(tǒng)內(nèi)部的模塊能更容易擴(kuò)展和維護(hù)。
讓子系統(tǒng)更加易用,客戶端不再需要了解子系統(tǒng)內(nèi)部的實(shí)現(xiàn),也不需要跟眾多子系統(tǒng)內(nèi)部的模塊進(jìn)行交互,只需要跟外觀類交互就可以了。
可以幫助我們更好地劃分訪問的層次。有些方法是對(duì)系統(tǒng)外的,有些方法是系統(tǒng)內(nèi)部使用的。把需要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內(nèi)部的細(xì)節(jié)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談SpringMVC+Spring3+Hibernate4開發(fā)環(huán)境搭建
MVC已經(jīng)是現(xiàn)代Web開發(fā)中的一個(gè)很重要的部分,本文介紹一下SpringMVC+Spring3+Hibernate4的開發(fā)環(huán)境搭建,有興趣的可以了解一下。2017-01-01springcloud使用feign調(diào)用服務(wù)時(shí)參數(shù)內(nèi)容過大問題
這篇文章主要介紹了springcloud使用feign調(diào)用服務(wù)時(shí)參數(shù)內(nèi)容過大問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03基于SpringBoot構(gòu)建電商秒殺項(xiàng)目代碼實(shí)例
這篇文章主要介紹了基于SpringBoot構(gòu)建電商秒殺項(xiàng)目代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05SpringBoot項(xiàng)目速度提升之延遲初始化(Lazy Initialization)詳解
延遲初始化(Lazy?Initialization)是一種在需要時(shí)才創(chuàng)建或加載對(duì)象的策略,以減少啟動(dòng)時(shí)間和資源消耗,本文就來講講延遲初始化的具體使用吧2023-05-05Java 實(shí)戰(zhàn)項(xiàng)目之家居購(gòu)物商城系統(tǒng)詳解流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)家居購(gòu)物商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11