背景
正如電腦主機和顯示器之間,主機的配置千變?nèi)f化,不斷升級,顯示器可能升級緩慢,[OOD] 隔離變化橋接模式
。如果這時你買的是一體機,硬件升級就要受到限制。這就是一個典型的分離變化的需求場景。在應(yīng)用中,一個業(yè)務(wù)會有多個協(xié)作者,直接耦合會導(dǎo)致其中一個類的變化就會影響其它類的行為。這時最好的做法是對行為進行抽象,區(qū)分出變與不變,或者核心與外圍的部分,然后定義出接口來隔離變化。
以Chromium的主文檔加載為例。FrameLoader負責(zé)一個Frame的加載邏輯,從開始加載(load())或者重新加載(reload()),到結(jié)束(stopLoading()),這個過程是固定的,概括而言(即進行抽象)就是: 開始 ->發(fā)送請求 -> 收到響應(yīng)頭信息 -> 收到頁面數(shù)據(jù)-> 完成。
但是中間過程中每個階段可能做的事情不一樣 (識別變化),包括: 1. 請求發(fā)送前,做些準備工作,或者改變一些參數(shù)。 2. 收到響應(yīng)頭,判斷一下響應(yīng)頭里如果有特殊字段,需要采取不同的行為,
電腦資料
《[OOD] 隔離變化橋接模式》(http://www.msguai.com)。等等。一邊是Frame和FrameLoader的交互,另一邊則是FrameLoader與業(yè)務(wù)層的交互。這就是需要進行隔離的界面。
設(shè)計方案
Frame和FrameLoader仍然關(guān)注于加載的邏輯,需要外部的協(xié)作時通過FrameLoaderClient這個接口與具體的實現(xiàn)交互。外部的FrameLoaderClientImpl執(zhí)行如何的操作時也完全由它們控制,比如FrameLoaderClientImpl,有些事則進一步交由再上層的模塊去完成。
這種方案被大量使用,比如WebViewClient和WebWidget:這個示例更接近于它所屬的橋接(Bridge)模式, 而上面FrameLoaderClient則像是一個退化的版本。
小結(jié)
這種模式就是橋接模式(Bridge Pattern)。核心都是使用一個抽象的接口隔離變化,既提高了各層的內(nèi)聚性,又降低它們間的耦合。符合OO原則中的: 1. 封裝變化 2. 針對接口編程,而不針對具體的實現(xiàn)。 3. 降低交互對象的耦合度。
缺點是: 提高了復(fù)雜度。