「設計模式自習室」門面模式 Facade Pattern

「設計模式自習室」門面模式 Facade Pattern

前言

《設計模式自習室》系列,顧名思義,本系列文章帶你溫習常見的設計模式。主要內容有:

  • 該模式的介紹,包括: 引子、意圖(大白話解釋) 類圖、時序圖(理論規範)
  • 該模式的代碼示例:熟悉該模式的代碼長什麼樣子
  • 該模式的優缺點:模式不是萬金油,不可以濫用模式
  • 該模式的應用案例:瞭解它在哪些重要的源碼中被使用

該系列會逐步更新於我的博客和公眾號(博客見文章底部),也希望各位觀眾老爺能夠關注我的個人公眾號:後端技術漫談,不會錯過精彩好看的文章。

系列文章回顧

  • 【設計模式自習室】開篇:為什麼我們要用設計模式?
  • 【設計模式自習室】建造者模式
  • 【設計模式自習室】原型模式
  • 【設計模式自習室】透徹理解單例模式
  • 【設計模式自習室】理解工廠模式的三種形式
  • 【設計模式自習室】適配器模式
  • 【設計模式自習室】裝飾模式
  • 【設計模式自習室】橋接模式 Bridge Pattern:處理多維度變化

結構型——外觀模式/門面模式 Facade Pattern

引子

門面模式便是把一些複雜的流程封裝成一個接口供給外部用戶更簡單的使用。

比如用戶是用電腦,電腦有操作:開機關機重啟等。每個操作裡都有複雜的邏輯,比如開始需要先啟動BIOS-引導硬盤—進入系統-初始化桌面等。對於使用者來說,只需要調用開機的方法。

「設計模式自習室」門面模式 Facade Pattern

定義

門面模式( Facade Pattern) 也叫做外觀模式, 是一種比較常用的封裝模式,

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.( 要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。 門面模式提供一個高層次的接口, 使得子系統更易於使用。 )

類圖

如果看不懂UML類圖,可以先粗略瀏覽下該圖,想深入瞭解的話,可以繼續谷歌,深入學習:

「設計模式自習室」門面模式 Facade Pattern

門面模式類圖:

「設計模式自習室」門面模式 Facade Pattern

  • 客戶角色(Client): 客戶通過調用Facede來完成要實現的功能。
  • 門面角色(Facade):它被客戶角色調用,並且知道自己管理著的子系統。內部根據客戶角色的需求預定了幾種功能的組合。
  • 子系統角色(SystemA/B/C):實現了子系統的功能。它對客戶角色是完全透明的。它內部可以有系統內的相互交互,也可以由供外界調用的接口。

時序圖

時序圖(Sequence Diagram)是顯示對象之間交互的圖,這些對象是按時間順序排列的。時序圖中顯示的是參與交互的對象及其對象之間消息交互的順序。

我們可以大致瀏覽下時序圖,如果感興趣的小夥伴可以去深究一下:

「設計模式自習室」門面模式 Facade Pattern

代碼實現

門面Facade:

<code>publicclassComputer{publicstaticfinalLoggerLOGGER=Logger.getLogger(Computer.class);privateCPUcpu;privateMemorymemory;privateDiskdisk;publicComputer(){cpu=newCPU();memory=newMemory();disk=newDisk();}publicvoidstart(){LOGGER.info("Computerstartbegin");cpu.start();disk.start();memory.start();LOGGER.info("Computerstartend");}publicvoidshutDown(){LOGGER.info("ComputershutDownbegin");cpu.shutDown();disk.shutDown();memory.shutDown();LOGGER.info("ComputershutDownend...");}}/<code>

客戶端調用Client:

<code>publicclassClient{publicstaticfinalLoggerLOGGER=Logger.getLogger(Client.class);publicstaticvoidmain(String[]args){Computercomputer=newComputer();computer.start();computer.shutdown();}/<code>

對於用戶來說,使用Client完全不需要關心底層細節。

使用場景舉例

典型例子:SLF4J 中的外觀模式

SLF4J 是簡單的日誌外觀模式框架,抽象了各種日誌框架例如 Logback、Log4j、Commons-logging 和 JDK 自帶的 logging 實現接口。它使得用戶可以在部署時使用自己想要的日誌框架。

SLF4J 沒有替代任何日誌框架,它僅僅是標準日誌框架的外觀模式。如果在類路徑下除了 SLF4J 再沒有任何日誌框架,那麼默認狀態是在控制檯輸出日誌。

「設計模式自習室」門面模式 Facade Pattern

spring jdbc中的外觀模式

查看 org.springframework.jdbc.support.JdbcUtils

Mybatis中的外觀模式

查看 org.apache.ibatis.session.Configuration 類中以 new 開頭的方法

<code>publicclassConfiguration{publicExecutornewExecutor(Transactiontransaction,ExecutorTypeexecutorType){executorType=executorType==null?defaultExecutorType:executorType;executorType=executorType==null?ExecutorType.SIMPLE:executorType;Executorexecutor;if(ExecutorType.BATCH==executorType){executor=newBatchExecutor(this,transaction);}elseif(ExecutorType.REUSE==executorType){executor=newReuseExecutor(this,transaction);}else{executor=newSimpleExecutor(this,transaction);}if(cacheEnabled){executor=newCachingExecutor(executor);}executor=(Executor)interceptorChain.pluginAll(executor);returnexecutor;}publicResultSetHandlernewResultSetHandler(Executorexecutor,MappedStatementmappedStatement,RowBoundsrowBounds,ParameterHandlerparameterHandler,ResultHandlerresultHandler,BoundSqlboundSql){ResultSetHandlerresultSetHandler=newDefaultResultSetHandler(executor,mappedStatement,parameterHandler,resultHandler,boundSql,rowBounds);resultSetHandler=(ResultSetHandler)interceptorChain.pluginAll(resultSetHandler);returnresultSetHandler;}//...省略...}/<code>

Tomcat 中的外觀模式

org.apache.catalina.connector.Request 和 org.apache.catalina.connector.RequestFacade 這兩個類都實現了 HttpServletRequest 接口

優缺點

優點

  • 鬆散耦合:使得客戶端和子系統之間解耦,讓子系統內部的模塊功能更容易擴展和維護;
  • 簡單易用:客戶端根本不需要知道子系統內部的實現,或者根本不需要知道子系統內部的構成,它只需要跟Facade類交互即可。
  • 更好的劃分訪問層次:有些方法是對系統外的,有些方法是系統內部相互交互的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就可以實現客戶端的使用,很好的隱藏了子系統內部的細節。

缺點

  • 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。

參考

  • 《HEAD FIRST設計模式》
  • https://www.cnblogs.com/lthIU/p/5860607.html
  • https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html
  • https://blog.csdn.net/wwwdc1012/article/details/82729516

關注我

我是一名後端開發工程師。

主要關注後端開發,數據安全,爬蟲,物聯網,邊緣計算等方向,歡迎交流。

各大平臺都可以找到我

  • 微信公眾號:後端技術漫談
  • Github:@qqxx6661
  • CSDN:@後端技術漫談
  • 知乎:@後端技術漫談
  • 簡書:@後端技術漫談
  • 掘金:@後端技術漫談
  • Java面試知識點複習全手冊
  • 設計模式/數據結構 自習室
  • Leetcode/劍指offer 算法題解析
  • SpringBoot/SpringCloud菜鳥入門實戰系列
  • 爬蟲相關技術文章
  • 後端開發相關技術文章
  • 逸聞趣事/好書分享/個人興趣
「設計模式自習室」門面模式 Facade Pattern

如果文章對你有幫助,不妨收藏,投幣,轉發,在看起來~


分享到:


相關文章: