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

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