2011年4月6日 星期三

Gof Creational - Adapter Pattern

Adapter Pattern

  • 轉接器,其實很常見的一個概念,ps/2 to usb  , COM to usb ...etc,但可以訂出真正定義為將一個類別的介面,轉換成另一個介面以供客戶使用,轉接器讓原本介面不相容的類別可以合作無間。

  • Class Diagram





[caption id="attachment_168" align="alignnone" width="600" caption="AdapterPattern"]AdapterPattern[/caption]





  • 模擬情境


鴨子與火雞的故事,假設平常都是鴨子在表演,有一天發現鴨子不夠了,想利用火雞來魚目混珠,顯而易見的,必須讓火雞學會一些鴨子的技能,如此才能混人耳目。


public interface Duck{


public void quack();


public void fly();


}


public interface Turkey{


public void gobble();


public void fly();


}


撰寫轉接器的主要步驟大概有以下這幾點:


public class TurkeyAdapter implements Duck{


//實作想要轉換的型態,也就是客戶想要看到的介面,以這故事為例,我可能需要一個火雞轉接器來實作鴨子


Turkey turkey;


public TurkeyAdapter(Turkey turkey){


//取得被轉換者的物件實體參考,在本例子當中適用constructor


this.turkey = turkey;


}


public void quack(){


turkey.gobble();


//需要實作類別中所有的方法,quack()在類別之間的轉變就相當簡單,直接呼叫gobble()即可


}


public void fly(){


for loop - turkey.fly();


//雖然兩個介面都有fly方法,但火雞自己多飛幾次使得他的飛行距離看起來更像鴨子


}


}




  • 對於轉接器使用的過程如下:





    1. 客戶端透過目標介面(鴨子)呼叫轉接器的方法,對轉接器發出要求。

    2. 轉接器透過被轉接者介面,呼叫被轉接者的一個或多個方法,將請求轉給被轉接者。

    3. 客戶接收到呼叫的結果,但並未察覺這一切是透過一個轉接器居中聯繫。





  • 常見的轉接器 - Collection with Vector , Stack , Hashtable and the newly Iterator


對於轉接器模式有兩種,一種是 Object Adapter,另一種是Class Adapter,但Class Adapter需要有多重繼承的支援才可進行,所以在Java Solution當中是看不到的,而多重繼承的結果,也使得轉接器很方便的直接叫用被轉接者的method使用了。

沒有留言: