橋接模式和適配器模式的區別

很多時候經常容易把橋接模式和適配器模式弄混。那什麼時候用橋接,什麼時候用適配器呢 ?

共同點

橋接和適配器都是讓兩個東西配合工作

不同點

出發點不同。
         1)適配器:改變已有的兩個接口,讓他們相容。
         2)橋接模式:分離抽象化和實現,使兩者的接口可以不同,目的是分離。

        所以說,如果你拿到兩個已有模塊,想讓他們同時工作,那麼你使用的適配器。
        如果你還什麼都沒有,但是想分開實現,那麼橋接是一個選擇。

        橋接是先有橋,纔有兩端的東西
        適配是先有兩邊的東西,纔有適配器

        橋接是在橋好了之後,兩邊的東西還可以變化。

       例如遊戲手柄,就象個橋,它把你的任何操作轉化成指令。
     (雖然,你可以任何操作組合,但是你的操作脫不開山下左右,a,b,選擇 ,確定)
      JRE本身就是一個就是一個很好的橋,先寫好在linux上執行的Jre,再寫好可以在windows下執行的JRE,
      這樣無論什麼樣的Java程序,只要配和相應的Jre就能在Linux或者Windows上運行.
      兩個Jre並沒有限定你寫什麼樣的程序,但要求你必須用Java來寫。

--------------------------------------------------------

在這篇文章中,我寫了Bridge和adapter模式的區別.但是 maninred說
Bridge和adapter是沒有關係的,而和Facade比較象,但在我的經驗中更多的時候
是會混淆Bridge和adapter而不是Facade,這裏詳細的列出三個模式的比較 .

一. 定義:

1.  Facade模式是爲一個複雜系統提供一個簡單的接口。
比如你要去博物館參觀,很多東西,你一個個到處去問每個東西的管理員很麻煩,所以你找一個導遊,讓他給你一個個介紹,你只要找到導遊就好了。導遊就是門面。
2. 適配器模式,引用一下GOF95中的話:
適配器模式是把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法工作的兩個類能夠工作到一起。
舉個例子,例如變壓器
3. Bridge模式:
GOF95中的橋樑模式的描述:橋樑模式的用意是"將抽象化與實現化脫耦,使的二者可以獨立變化。
例如AWT的實現

二. 目的

1. Facade 模式使用在給一個複雜的系統提供統一的門面(接口),目的是簡化客戶端的操作,但並沒有改變接口.
2. Adapter 模式使用在兩個部分有不同的接口的情況,目的是改變接口,使兩個部分協同工作
3. 橋接模式 是爲了分離抽象和實現

二. 使用場合

1. Facade

   出現較多是這樣的情況,你有一個複雜的系統,對應了各種情況,
客戶看了說功能不錯,但是使用太麻煩.你說沒問題,我給你提供一個統一的門面.
所以Facade使用的場合多是對系統的"優化".
2. Adapter

   出現是這樣的情況,你有一個類提供接口A,但是你的客戶需要一個實現接口B的類,
這個時候你可以寫一個Adapter讓把A接口變成B接口,所以Adapter使用的場合是
指鹿爲馬.就是你受夾板氣的時候,一邊告訴你我只能提供給你A(鹿),一邊告訴你說
我只要B(馬),他長了四條腿,你沒辦法了,把鹿牽過去說,這是馬,你看他有四條腿.
(當然實現指鹿爲馬也有兩種方法,一個方法是你只露出鹿的四條腿,說你看這是馬,這種方式就是
封裝方式的Adapter實現,另一種方式是你把鹿牽過去,但是首先介紹給他說這是馬,因爲他長了四條腿
這種是繼承的方式.)
3. Bridge

    在一般的開發中出現的情況並不多,AWT是一個,SWT也算部分是,
如果你的客戶要求你開發一個系統,這個系統在Windows下運行界面的樣子是Windows的樣子.
在Linux下運行是Linux下的樣子.在Macintosh下運行要是Mac Os的樣子.
怎麼辦? 定義一系列的控件Button,Text,radio,checkBox等等.供上層開發者
使用,他們使用這些控件的方法,利用這些控件構造一個系統的GUI,然後你爲這些控件
寫好Linux的實現,讓它在Linux上調用Linux本地的對應控件,
在Windows上調用Windows本地的對應控件,在Macintosh上調用Macintosh本地的對應控件
ok,你的任務完成了.

三. 需求程度

1. Facade的需求程度是  "中等"  ,因爲你不提供Facade程序照樣能工作,只是不夠好.
2. Adapter的需求程度是  "必須"  ,因爲你不這麼做就不能工作,除非你自己從頭實現一個.
3. Bridge的需求程度是  "一般"  ,適合精益求精的人,因爲你可以寫三個程序給客戶.

四. 出現時期

1. Facade出現在項目中期,再優化
2. Adapter出現在項目後期,大部分都有了,差的僅僅是接口不同
3. Bridge出現在項目前期,你想讓你的系統更靈活,更cool

五. 在寫文章的時候想到的

1. Facade很多時候是1:m的關係
2. Adapter很多是候是1:1的關係
3. Bridge很多時候是m:n的關係
呵呵.

六. 最後

另外:迴應一下maninred
1. 我並沒有把模式看的很獨立。

    其實很多模式是配合使用的,而且在一定情況下可以
用一個替換另一個.同一個需求,有可能當你思考的角度不同時,使用的模式就不同了.
2. 設計模式並不是"用OO的封裝來封裝所有的東西"。

    模式其實可以應用於所有的設計上和OO沒有直接的關係,只是因爲計算機的設計模式大部分是GOF收集總結的,他們講解設計模式是用的C++,而在Java中得到了大量應用,所以我們談到設計模式的時候多提到OO.其實模式更早應用於建築學,Alexander的《建築的永恆之道》講的就是設計模式。所以說設計模式應該是設計過程中積累下來的一些成型的東西。更深入一點,《Java與模式》的作者認爲模式起源於中國的道教思想,講的是哲學。呵呵。
3. 對於模式的使用,個人感覺,模式很大程度上是爲了對應這類需求的所有情況。

    也就是最複雜情況,最靈活情況,當我們實際的開發中並沒有遇到這麼多這樣的情況。
所以在需要的時候使用,根據需求簡化使用,而不是照搬。
4. 雖然模式是相關的,但是隻有知道了每個模式的區別點,才能更好的根據需求選擇使用哪個模式。


轉載自:http://qinjs.blog.163.com/blog/static/23029492008123627012/

發佈了3 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章