顧名思義,橋的作用就是將兩條相互獨立的路橋接到一起,而兩條路可以保持各自的相對獨立。在程序設計中,“橋”模式中的橋只是一種形象的比喻。根據橋模式的定義,橋模式實現了一個主題(可以是一個類,也可以是一中設計上的概念)的抽象部分和實現部分的分離(有的地方定義為抽象與具體行為的分離)。抽象部分的基類和實現部分的基類充就當著橋(接口對接)的作用,而抽象部分的子類和實現部分的子類就是橋兩邊的路,可以各自相對獨立的發展(變化)(之所以是相對獨立,從實現上來講就是這種變化不能脫離最終能夠實現橋接這個目標)。
我們知道,對于對象的研究,我們可以用這樣的模型來表達對象:屬性和行為。行為和屬性都是對象的特征,其中屬性描述對象的靜態特征,而行為表達對象的動態特征,一般來講,動態特征往往跟靜態特征密切相關,相互影響,靜態特征會約束動態特征的(行為),比如一個人如果是小孩(屬性),那么他的行為很多都是受約束的,反過來,如果一個人經過吃(行為),又會長大,影響到身高,體重等(屬性)。因為對象的特征都會發生變化,如果我們要表達這種變化,一是需要對這些對象根據我們的實際需要進行抽象,提取需要的特征,而對那些次要或者不需要的特征進行剔除。但這僅僅是研究對象的基礎--抽象,我們還是需要表達重要特征的變化。
對于靜態特征而言,變化的表達比較簡單,只需要修改特征值即可,而且在實現上也比較容易,只要不同層次的對象都保持自己的特征值即可。但對于行為特征就不一樣了,因為行為特征不僅受到靜態特征這個約束,還會受到環境的影響。要用分類模式來表達所有靜態特征和行為特征的變化是很困難的,我們只考察一種靜態特征和一種行為特征的變化,這是最基本的一種情況,考慮到現有的技術體系,我們有兩種方法來實現:
A)利用類的單繼承來實現(形成分類層次),比如人是抽象類,有個重要的特征性別,一個重要的行為跑,性別不同跑的行為當然也不一樣,利用繼承,我們可以派生出兩個子類——男人和女人。這樣行為跑也可以分為男人的跑和女人的跑,當然,如果僅僅是研究跑與性別的關系,問題是可以解決。但前面說了,行為除了受到靜態特征的約束外,還會受到環境的影響,比如在不同產地的跑。這種情況下,如果還按照繼承分類的方式去做,顯然是不可取的,一是類體系太復雜,二是用環境來分類對象顯然也不是一種可取的方式,因為環境是外在的。
B)通過類的多繼承來實現,對于多個特征的變化,這種方法可以減少類的數量,對于上述的例子,我們可以用一個對象的抽象和環境(比如產地)的抽象,人可以分為男人,女人,環境可以分為沙地,塑料跑道等。要描述男人在沙地跑,我們就從沙地和男人繼承形成一個新的子類。這種方式看起來是可以,但有很多問題,一是不太符合對象分類原則(研究對象的分類一般都是根據對象本身,而不是會根據環境),在類體系上對象與環境天然就應該分離。二是從技術實現上來講也比較麻煩,也違背了責任單一原則。
那怎么來解決這種問題呢?我們來分析一下類的靜態特征和動態特征,我們發現,對于靜態特征的變化我們大多時候并不需要提供派生類來實現,只需要通過修改設置靜態特征數據就可以了,只有那些對行為影響非常大,又屬于我們主要研究范疇的靜態特征,我們才需要按此屬性進行派生,(比如,性別),而行為特征的變化,除了受到靜態特征的影響外,還受到外界環境的影響,同時也會影響外界環境,比如人的跑這個行為在不同場地上跑是不一樣的(比如沙地,水泥地),如果我們也采用繼承的方式來實現這種變化,一是上面說的弊端,二從邏輯上我們也很難接受根據行為的環境來進行類派生的做法(雖然技術上是可以的),很難將一個跑在沙地和跑在水泥地人視為不同的類(人),但我們可以將場地進行抽象,將人在某個產地跑的行為委托給產地來實現,我們在人這個類中保持一個對場地的引用,而在跑的方法中除了實現自己必要的邏輯外,可以調用場地中的跑來具體實現跑的行為。因為雙方各自可以采用繼承的方式實現自己的變化,我們就可以在實際使用時臨時指派具體場地。這樣既減少了類的數量,又使得邏輯更加簡單和靈活。下面是一個簡單的例子類圖:
從上面的例子我們可以看出,增加一個人的子類,或者增加一個產地,原來的結構都不需要動,符合設計的開閉原則。
A、橋模式實現了類中行為抽象與行為實現的分離,同時可以實現類本身和行為實現的各自發展。理論上對于任何特征都可以通過這種委托來實現抽象與實現的分離,但我覺得不推薦這種泛濫的應用,對于主要受靜態特征影響而變化的行為我們可以通過繼承來實現這種變化,只對受外在環境影響比較大的行為特征才使用這種模式來實現。
B.對于橋模式中抽象類保持一個對實現類的引用并不是必要的,對于上述例子,完全可以在通過Run的參數化來完成這種組合,這樣人與產地的關系就可以從關聯關系弱化到簡單依賴。
C.橋模式提供了一種減少類的方法,為類沿著多維特征各自變化的情況提供了一種解決方法。
后記:橋模式可以實現系統在多個維度上的獨立變化,這本身就要求系統在這些維度上的變化能夠獨立,如果這些維度相互之間存在著關聯或者依賴,就會使得體系中關系過于復雜,相互之間的通信太多,甚至不能實現,比如人的行為跑,呼吸,說話,這幾種行為相互影響有聯系,就很難使用橋模式來實現,而在這種情況下就需要用建立數學模型的方式來進行。
==========================================
以前寫的,稍做修改。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
