[OOD] 隔離變化-橋接模式

背景

正如電腦主機和顯示器之間,主機的配置千變萬化,不斷升級,顯示器可能升級緩慢。如果這時你買的是一體機,硬件升級就要受到限制。這就是一個典型的分離變化的需求場景。

在應用中,一個業務會有多個協作者,直接耦合會導致其中一個類的變化就會影響其它類的行爲。這時最好的做法是對行爲進行抽象,區分出變與不變,或者核心與外圍的部分,然後定義出接口來隔離變化。

以Chromium的主文檔加載爲例。FrameLoader負責一個Frame的加載邏輯,從開始加載(load())或者重新加載(reload()),到結束(stopLoading()),這個過程是固定的,概括而言(即進行抽象)就是:
 開始 -> 發送請求 -> 收到響應頭信息 -> 收到頁面數據 -> 完成。

但是中間過程中每個階段可能做的事情不一樣 (識別變化),包括:
  1. 請求發送前,做些準備工作,或者改變一些參數。
  2. 收到響應頭,判斷一下響應頭裏如果有特殊字段,需要採取不同的行爲。
等等。

一邊是Frame和FrameLoader的交互,另一邊則是FrameLoader與業務層的交互。這就是需要進行隔離的界面。

設計方案


Frame和FrameLoader仍然關注於加載的邏輯,需要外部的協作時通過FrameLoaderClient這個接口與具體的實現交互。外部的FrameLoaderClientImpl執行如何的操作時也完全由它們控制,比如FrameLoaderClientImpl,有些事則進一步交由再上層的模塊去完成。

這種方案被大量使用,比如WebViewClient和WebWidget:
          
這個示例更接近於它所屬的橋接(Bridge)模式, 而上面FrameLoaderClient則像是一個退化的版本。

小結

這種模式就是橋接模式(Bridge Pattern)。

核心都是使用一個抽象的接口隔離變化,既提高了各層的內聚性,又降低它們間的耦合。符合OO原則中的:
  1. 封裝變化
  2. 針對接口編程,而不針對具體的實現。
  3. 降低交互對象的耦合度。

缺點是: 提高了複雜度。

發佈了220 篇原創文章 · 獲贊 29 · 訪問量 174萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章