設計模式之-橋模式

來源:互聯網
上載者:User

顧名思義,橋的作用就是將兩條相互獨立的路橋接到一起,而兩條路可以保持各自的相對獨立。在程式設計中,“橋”模式中的橋只是一種形象的比喻。根據橋模式的定義,橋模式實現了一個主題(可以是一個類,也可以是一中設計上的概念)的抽象部分和實現部分的分離(有的地方定義為抽象與具體行為的分離)。抽象部分的基類和實現部分的基類充就當著橋(介面對接)的作用,而抽象部分的子類和實現部分的子類就是橋兩邊的路,可以各自相對獨立的發展(變化)(之所以是相對獨立,從實現上來講就是這種變化不能脫離最終能夠實現橋接這個目標)。   

 我們知道,對於對象的研究,我們可以用這樣的模型來表達對象:屬性和行為。行為和屬性都是對象的特徵,其中屬性描述對象的靜態特徵,而行為表達對象的動態特徵,一般來講,動態特徵往往跟靜態特徵密切相關,相互影響,靜態特徵會約束動態特徵的(行為),比如一個人如果是小孩(屬性),那麼他的行為很多都是受約束的,反過來,如果一個人經過吃(行為),又會長大,影響到身高,體重等(屬性)。因為對象的特徵都會發生變化,如果我們要表達這種變化,一是需要對這些對象根據我們的實際需要進行抽象,提取需要的特徵,而對那些次要或者不需要的特徵進行剔除。但這僅僅是研究對象的基礎--抽象,我們還是需要表達重要特徵的變化。

對於靜態特徵而言,變化的表達比較簡單,只需要修改特徵值即可,而且在實現上也比較容易,只要不同層次的對象都保持自己的特徵值即可。但對於行為特徵就不一樣了,因為行為特徵不僅受到靜態特徵這個約束,還會受到環境的影響。要用分類模式來表達所有靜態特徵和行為特徵的變化是很困難的,我們只考察一種靜態特徵和一種行為特徵的變化,這是最基本的一種情況,考慮到現有的技術體系,我們有兩種方法來實現:

   A)利用類的單繼承來實現(形成分類層次),比如人是抽象類別,有個重要的特徵性別,一個重要的行為跑,性別不同跑的行為當然也不一樣,利用繼承,我們可以派生出兩個子類——男人和女人。這樣行為跑也可以分為男人的跑和女人的跑,當然,如果僅僅是研究跑與性別的關係,問題是可以解決。但前面說了,行為除了受到靜態特徵的約束外,還會受到環境的影響,比如在不同產地的跑。這種情況下,如果還按照繼承分類的方式去做,顯然是不可取的,一是類體系太複雜,二是用環境來分類對象顯然也不是一種可取的方式,因為環境是外在的。

   B)通過類的多繼承來實現,對於多個特徵的變化,這種方法可以減少類的數量,對於上述的例子,我們可以用一個對象的抽象和環境(比如產地)的抽象,人可以分為男人,女人,環境可以分為沙地,塑料跑道等。要描述男人在沙地跑,我們就從沙地和男人繼承形成一個新的子類。這種方式看起來是可以,但有很多問題,一是不太符合對象分類原則(研究對象的分類一般都是根據對象本身,而不是會根據環境),在類體繫上對象與環境天然就應該分離。二是從技術實現上來講也比較麻煩,也違背了責任單一原則。

   那怎麼來解決這種問題呢?我們來分析一下類的靜態特徵和動態特徵,我們發現,對於靜態特徵的變化我們大多時候並不需要提供衍生類別來實現,只需要通過修改設定靜態特徵資料就可以了,只有那些對行為影響非常大,又屬於我們主要研究範疇的靜態特徵,我們才需要按此屬性進行派生,(比如,性別),而行為特徵的變化,除了受到靜態特徵的影響外,還受到外界環境的影響,同時也會影響外界環境,比如人的跑這個行為在不同場地上跑是不一樣的(比如沙地,水泥地),如果我們也採用繼承的方式來實現這種變化,一是上面說的弊端,二從邏輯上我們也很難接受根據行為的環境來進行類派生的做法(雖然技術上是可以的),很難將一個跑在沙地和跑在水泥地人視為不同的類(人),但我們可以將場地進行抽象,將人在某個產地跑的行為委託給產地來實現,我們在人這個類中保持一個對場地的引用,而在跑的方法中除了實現自己必要的邏輯外,可以調用場地中的跑來具體實現跑的行為。因為雙方各自可以採用繼承的方式實現自己的變化,我們就可以在實際使用時臨時指派具體場地。這樣既減少了類的數量,又使得邏輯更加簡單和靈活。下面是一個簡單的例子類圖:

從上面的例子我們可以看出,增加一個人的子類,或者增加一個產地,原來的結構都不需要動,符合設計的開閉原則。

總結如下:

A、橋模式實現了類中行為抽象與行為實現的分離,同時可以實作類別本身和行為實現的各自發展。理論上對於任何特徵都可以通過這種委託來實現抽象與實現的分離,但我覺得不推薦這種泛濫的應用,對於主要受靜態特徵影響而變化的行為我們可以通過繼承來實現這種變化,只對受外在環境影響比較大的行為特徵才使用這種模式來實現。

B.對於橋模式中抽象類別保持一個對實作類別的引用並不是必要的,對於上述例子,完全可以在通過Run的參數化來完成這種組合,這樣人與產地的關係就可以從關聯關係弱化到簡單依賴。

C.橋模式提供了一種減少類的方法,為類沿著多維特徵各自變化的情況提供了一種解決方案。

後記:橋模式可以實現系統在多個維度上的獨立變化,這本身就要求系統在這些維度上的變化能夠獨立,如果這些維度相互之間存在著關聯或者依賴,就會使得體系中關係過於複雜,相互之間的通訊太多,甚至不能實現,比如人的行為跑,呼吸,說話,這幾種行為相互影響有聯絡,就很難使用橋模式來實現,而在這種情況下就需要用建立數學模型的方式來進行。 

==========================================

以前寫的,稍做修改。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.