日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
工作五年了,居然還不懂門面模式!

大家好,我是老田,從今天開始,本公眾號(hào)每周給大家送福利,送什么呢?肯定是技術(shù)書啦,不搞那么多花里胡哨的,參與方式見文末。

鞏留ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

好啦,進(jìn)入我們的主題,今天我給大家分享設(shè)計(jì)模式中的門面模式。用貼切的生活故事,以及真實(shí)項(xiàng)目場(chǎng)景來講設(shè)計(jì)模式,最后用一句話來總結(jié)這個(gè)設(shè)計(jì)模式。

故事

開發(fā)的朋友都知道,后端開發(fā)通常都是:

controller---servie---dao/mapper/repository

但是,我問過很多人,熟悉門面模式不?有的工作五年了都不知道。

今天老田,就帶你來看看門面模式。

門面模式概述

門面模式(Facade Pattern)又叫作外觀模式,提供了一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。其主要特征是定義了一個(gè)高層接口,讓子系統(tǒng)更容易使用,屬于結(jié)構(gòu)型設(shè)計(jì)模式。

英文:

Provide a unified interface to a set of interfaces in asubsystem.Facade defines a higher-level interface that makes thesubsystem easier to use.

其實(shí),在日常編碼工作中,我們都在有意無(wú)意地大量使用門面模式。但凡只要高層模塊需要調(diào)度多個(gè)子系統(tǒng)(2個(gè)以上類對(duì)象),我們都會(huì)自覺地創(chuàng)建一個(gè)新類封裝這些子系統(tǒng),提供精簡(jiǎn)的接口,讓高層模塊可以更加容易地間接調(diào)用這些子系統(tǒng)的功能。

生活中的案例

關(guān)于門面模式,在生活中的案例,非常之多。

案例1:去銀行辦理業(yè)務(wù),有個(gè)前臺(tái)接待你,然后,這個(gè)前臺(tái)會(huì)問你需要辦什么業(yè)務(wù),他會(huì)一個(gè)一個(gè)帶你辦理,這樣我們就不需要到處亂串、到處找對(duì)應(yīng)業(yè)務(wù)窗口了。這個(gè)前臺(tái)人員就相當(dāng)于門面模式。

案例2:我們建房子,如果沒有包工頭的話,那就是你自己要去找水泥工,電工、裝修工等。但如果有了包工頭,這些活你都不用干了,直接跟包工頭說,需要電工來把線路搞好。這個(gè)包工頭就可以理解為門面模式。

案例3:我們后端開發(fā)的controller,也可以理解為門面模式,比如說獲取用戶賬戶信息,先查UserService獲取用戶信息,然后查UserAccountService用戶賬戶信息。

門面模式適用場(chǎng)景

在軟件系統(tǒng)中,門面模式適用于以下應(yīng)用場(chǎng)景。

  • 為一個(gè)復(fù)雜的模塊或子系統(tǒng)提供一個(gè)簡(jiǎn)潔的供外界訪問的接口。
  • 希望提高子系統(tǒng)的獨(dú)立性時(shí)。
  • 當(dāng)子系統(tǒng)由于不可避免的暫時(shí)原因?qū)е驴赡艽嬖贐ug或性能相關(guān)問題時(shí),可以通過門面模式提供一個(gè)高層接口,隔離客戶端與子系統(tǒng)的直接交互,預(yù)防代碼污染。

門面模式通用寫法

還是使用代碼來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的門面模式,因?yàn)樵蹅冏钕矚g的就是從demo開始。

業(yè)務(wù)場(chǎng)景:現(xiàn)在需要調(diào)用三個(gè)service的各自的方法:

 
 
 
 
  1. public class ServiceA { 
  2.     public void doA(){ 
  3.         System.out.println("do ServiceA"); 
  4.     } 
  5. public class ServiceB { 
  6.     public void doB(){ 
  7.         System.out.println("do ServiceB"); 
  8.     } 
  9.  
  10. public class ServiceC { 
  11.     public void doC(){ 
  12.         System.out.println("do ServiceC"); 
  13.     } 

在沒有引入門面模式的時(shí)候,客戶端是這么調(diào)用的:

 
 
 
 
  1. public class Client { 
  2.     public static void main(String[] args) { 
  3.         ServiceA serviceA=new ServiceA(); 
  4.         ServiceB serviceB=new ServiceB(); 
  5.         ServiceC serviceC=new ServiceC(); 
  6.  
  7.         serviceA.doA(); 
  8.         serviceB.doB(); 
  9.         serviceC.doC(); 
  10.     } 

每次,客戶端自己都需要?jiǎng)?chuàng)建很多service對(duì)象,如果涉及到有很多個(gè)service,那這代碼不是很尷尬嗎?會(huì)出現(xiàn)大量重復(fù)性的代碼。

運(yùn)行結(jié)果

 
 
 
 
  1. do ServiceA 
  2. do ServiceB 
  3. do ServiceC 

下面我們就來加入門面模式:

 
 
 
 
  1. public class Facade { 
  2.     //是不是很像我們controller里注入各種service? 
  3.     private ServiceA serviceA = new ServiceA(); 
  4.     private ServiceB serviceB = new ServiceB(); 
  5.     private ServiceC serviceC = new ServiceC(); 
  6.  
  7.     public void doA() { 
  8.         serviceA.doA(); 
  9.     } 
  10.  
  11.     public void doB() { 
  12.         serviceB.doB(); 
  13.     } 
  14.  
  15.     public void doC() { 
  16.         serviceC.doC(); 
  17.     } 

客戶端變成了:

 
 
 
 
  1. public class Client { 
  2.     public static void main(String[] args) { 
  3.         //輕輕松松的搞定,只需要?jiǎng)?chuàng)建門面這個(gè)對(duì)象即可 
  4.         Facade facade=new Facade(); 
  5.         facade.doA(); 
  6.         facade.doB(); 
  7.         facade.doC(); 
  8.     } 

運(yùn)行結(jié)果:

 
 
 
 
  1. do ServiceA 
  2. do ServiceB 
  3. do ServiceC 

門面模式UML圖

結(jié)合這個(gè)UML圖,在回顧銀行前臺(tái)人員和包工頭的案例,就更輕松的理解門面模式了。

門面模式中的角色

由上圖可以看到,門面模式主要包含2個(gè)角色。

  • 外觀角色(Facade):也叫作門面角色,是系統(tǒng)對(duì)外的統(tǒng)一接口。
  • 子系統(tǒng)角色(Service):可以同時(shí)有一個(gè)或多個(gè)Service。每個(gè)Service都不是一個(gè)單獨(dú)的類,而是一個(gè)類的集合。Service們并不知道Facade的存在,對(duì)于Service們而言,F(xiàn)acade 只是另一個(gè)客戶端而已(即Facade對(duì)ServiceA、ServiceB、ServiceC透明)。

門面模式的擴(kuò)展

優(yōu)點(diǎn)

● 減少系統(tǒng)的相互依賴   想想看,如果我們不使用門面模式,外界訪問直接深入到子系統(tǒng)內(nèi)部,相互之間是一種強(qiáng)耦合關(guān)系,你死我就死,你活我才能活,這樣的強(qiáng)依賴是系統(tǒng)設(shè)計(jì)所不能接受的,門面模式的出現(xiàn)就很好地解決了該問題,所有的依賴都是對(duì)門面對(duì)象的依賴,與子系統(tǒng)無(wú)關(guān)。

● 提高了靈活性   依賴減少了,靈活性自然提高了。不管子系統(tǒng)內(nèi)部如何變化,只要不影響到門面對(duì)象,任你自由活動(dòng)。

● 提高安全性   想讓你訪問子系統(tǒng)的哪些業(yè)務(wù)就開通哪些邏輯,不在門面上開通的方法,你休想訪問到 。

缺點(diǎn)

當(dāng)增加子系統(tǒng)和擴(kuò)展子系統(tǒng)行為時(shí),可能容易帶來未知風(fēng)險(xiǎn)。

不符合開閉原則。

某些情況下,可能違背單一職責(zé)原則。

大神們是如何使用的

在Spring中也是有大量使用到門面模式,比如說

 
 
 
 
  1. org.springframework.jdbc.support.JdbcUtils 

再來看看其中的方法

 
 
 
 
  1. public static void closeConnection(@Nullable Connection con) { 
  2.     con.close(); 
  3. public static Object extractDatabaseMetaData(DataSource dataSource, DatabaseMetaDataCallback action) 
  4.    throws MetaDataAccessException { 
  5.     Connection con = null; 
  6.   try { 
  7.    con = DataSourceUtils.getConnection(dataSource); 
  8.    DatabaseMetaData metaData = con.getMetaData(); 
  9.    if (metaData == null) { 
  10.       //..... 
  11.    } 
  12.    return action.processMetaData(metaData); 
  13.   } 
  14. ...... 

都是給我封裝好了方法,對(duì)于我們開發(fā)者來說,我只面向JdbcUtils這一個(gè)類就好了,我不用去管Connection、ResultSet等是怎么創(chuàng)建的,需要的時(shí)候,我調(diào)用JdbcUtils的對(duì)應(yīng)方法即可獲得對(duì)應(yīng)的對(duì)象。

在Mybatis中也是用到了門面模式,比如:

 
 
 
 
  1. org.apache.ibatis.session.Configuration 

在Configuration中以new開頭的方法,比如:

 
 
 
 
  1. public Executor newExecutor(Transaction transaction) { 
  2.     return newExecutor(transaction, defaultExecutorType); 
  3. public MetaObject newMetaObject(Object object) { 
  4.     return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory); 
  5.  
  6. public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { 
  7.     ... 
  8.     return parameterHandler; 
  9.  
  10. public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, 
  11.       ResultHandler resultHandler, BoundSql boundSql) { 
  12.    ... 
  13.     return resultSetHandler; 
  14.  
  15. public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement){ 
  16.    ... 

對(duì)于調(diào)用這些方法的地方,他并不知道是怎么new出來的對(duì)象,只管使用就行了。

在Tomcat中也有門面模式,比如:

 
 
 
 
  1. org.apache.catalina.connector.RequestFacade 

從名字就知道它用了門面模式。它封裝了非常多的request操作,也整合了很多servlet-api以外的內(nèi)容,給用戶使用提供了很大便捷。同樣,Tomcat針對(duì)Response和Session也封裝了對(duì)應(yīng)的ResponseFacade類和StandardSessionFacade類,感興趣的小伙伴可以深入了解一下。

PS:基本上所有以Facade結(jié)尾的類,都是使用到了門面模式。

參考:tom的設(shè)計(jì)模式課程

總結(jié)

好了,關(guān)于門面模式就分享這么多,看完本文是不是覺得門面模式其實(shí)很簡(jiǎn)單的,另外在工作也可以考慮是不是可以把它用上,同時(shí),面試的時(shí)候也可以用來吹吹。

最后用一句話來總結(jié)門面模式: 

打開一扇門,走向全世界。

本文轉(zhuǎn)載自微信公眾號(hào)「Java后端技術(shù)全棧」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java后端技術(shù)全棧公眾號(hào)。


文章題目:工作五年了,居然還不懂門面模式!
網(wǎng)站URL:http://www.5511xx.com/article/cojccce.html