[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. 降低交互對象的耦合度。
缺點是: 提高了複雜度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.