設(shè)計(jì)模式-門面模式

門面模式

參考資料

圖解設(shè)計(jì)模式

大話設(shè)計(jì)模式

設(shè)計(jì)模式之禪

github我見(jiàn)過(guò)最好的設(shè)計(jì)模式

http://c.biancheng.net/view/1326.html

定義

也稱為外觀模式

外觀模式是一種結(jié)構(gòu)型設(shè)計(jì)模式, 能為程序庫(kù)、 框架或其他復(fù)雜類提供一個(gè)簡(jiǎn)單的接口。

  • 讓子系統(tǒng)更加容易使用,屬于結(jié)構(gòu)型模式

例子

App訂單接口

  • 后臺(tái)提供一個(gè)聚合接口
    • 在內(nèi)部分別調(diào)用了訂單,物流,用戶系統(tǒng)
  • 能夠節(jié)省前端的請(qǐng)求

適用場(chǎng)景

  • 子系統(tǒng)越來(lái)越復(fù)雜,增加門面模式來(lái)提供簡(jiǎn)單接口
  • 構(gòu)建多層系統(tǒng)結(jié)構(gòu),利用門面對(duì)象作為每層的入口,簡(jiǎn)化層間調(diào)用

生活中的例子

  • 前臺(tái)接待員
    • 用來(lái)做向?qū)?/li>
  • 包工頭
    • 通過(guò)包工頭來(lái)找粉刷匠,找泥工等

通用寫法

image-20210104125544586

物流系統(tǒng)案例

image-20210104125703356

門面業(yè)務(wù)幫我們聚合扣款,監(jiān)測(cè),發(fā)貨的功能,客戶端只需要找門面就行了

源碼中的案例

Spring的JdbcUtils

public static boolean supportsBatchUpdates(Connection con) {
  try {
    DatabaseMetaData dbmd = con.getMetaData();
    if (dbmd != null) {
      if (dbmd.supportsBatchUpdates()) {
        logger.debug("JDBC driver supports batch updates");
        return true;
      }
      else {
        logger.debug("JDBC driver does not support batch updates");
      }
    }
  }
  catch (SQLException ex) {
    logger.debug("JDBC driver 'supportsBatchUpdates' method threw exception", ex);
  }
  return false;
}

幫我們包裝了對(duì)連接的操作,這樣客戶端只需要使用JdbcUtils就行了

Mybatis的Configuration

public MetaObject newMetaObject(Object object) {
  return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
  ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
  parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
  return parameterHandler;
}

public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
                                            ResultHandler resultHandler, BoundSql boundSql) {
  ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
  resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
  return resultSetHandler;
}

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
  statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
  return statementHandler;
}

幫我們創(chuàng)建對(duì)應(yīng)的對(duì)象

和其他設(shè)計(jì)模式的區(qū)別

門面模式和代理的區(qū)別

  • 門面模式就是一種特殊的靜態(tài)代理
  • 門面模式,重點(diǎn)在于封裝
  • 靜態(tài)代理,重點(diǎn)是在增強(qiáng)

不做增強(qiáng)的靜態(tài)代理就是門面模式

門面模式和單例模式的區(qū)別

經(jīng)常把門面模式做成單例模式,工具包

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

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

  • 簡(jiǎn)化了調(diào)用過(guò)程,無(wú)需深入了解子系統(tǒng),防止給子系統(tǒng)帶來(lái)風(fēng)險(xiǎn)
  • 減少系統(tǒng)依賴,松散耦合
  • 更好的劃分訪問(wèn)層次,提高了安全性
  • 迪米特法則,最少知道原則

缺點(diǎn)

  • 增加子系統(tǒng)和擴(kuò)展子系統(tǒng)行為的時(shí)候,容易帶來(lái)未知風(fēng)險(xiǎn)
  • 不符合開(kāi)閉原則
  • 某些情況下可能違背單一職責(zé)原則

問(wèn)題

門面模式

想一想什么場(chǎng)景下考慮使用門面模式

  • 一個(gè)子系統(tǒng)比較復(fù)雜時(shí),比如算法或者業(yè)務(wù)比較復(fù)雜,就可以封裝出一個(gè)或多個(gè)門面出來(lái),項(xiàng)目的結(jié)構(gòu)簡(jiǎn)單,而且擴(kuò)展性非常好。
  • 對(duì)于一個(gè)較大項(xiàng)目,為了避免人員帶來(lái)的風(fēng)險(xiǎn),也可以使用門面模式,技術(shù)水平比較差的成員,盡量安排獨(dú)立的模塊,然后把他寫的程序封裝到一個(gè)門面里,盡量讓其他項(xiàng)目成員不用看到這些人的代碼,看也看不懂,我也遇到過(guò)一個(gè)“高人”寫的代 碼,private方法、構(gòu)造函數(shù)、常量基本都不用,你要一個(gè)public方法, 好,一個(gè)類里就一個(gè)public方法,所有代碼都在里面,然后你就看吧, 一大坨程序,看著就能把人逼瘋。使用門面模式后,對(duì)門面進(jìn)行單元測(cè)試,約束項(xiàng)目成員的代碼質(zhì)量,對(duì)項(xiàng)目整體質(zhì)量的提升也是一個(gè)比較好的幫助。

我的筆記倉(cāng)庫(kù)地址gitee 快來(lái)給我點(diǎn)個(gè)Star吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 門面模式 門面模式(Facade Pattern)又叫外觀模式,提供了一個(gè)統(tǒng)一的接口,用來(lái)訪問(wèn)子系統(tǒng)中的一群接口。...
    vincent浩哥閱讀 612評(píng)論 0 0
  • 門面模式(有時(shí)候也稱外觀模式)是指提供一個(gè)統(tǒng)一的接口去訪問(wèn)多個(gè)子系統(tǒng)的多個(gè)不同的接口,它為子系統(tǒng)中的一組接口提供一...
    中v中閱讀 440評(píng)論 0 0
  • 一:門面模式的定義 外觀模式的目的不是給予子系統(tǒng)添加新的功能接口,而是為了讓外部減少與子系統(tǒng)內(nèi)多個(gè)模塊的交互,松散...
    時(shí)待吾閱讀 960評(píng)論 0 0
  • UML關(guān)系簡(jiǎn)單介紹UML簡(jiǎn)單使用的介紹創(chuàng)建型設(shè)計(jì)模式Android設(shè)計(jì)模式-單例模式Android設(shè)計(jì)模式-工廠模...
    星宇V閱讀 793評(píng)論 0 4
  • 定義 門面模式是對(duì)象的結(jié)構(gòu)模式,外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口...
    步積閱讀 2,326評(píng)論 0 3

友情鏈接更多精彩內(nèi)容