?????? 通常,客戶類 通過類的接口訪問它提供的服務。有時,現有的類 可以提供客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的。這是由于現有的接口太詳細或者缺乏詳細或接口的名稱與客戶類所查找的不同等諸多不同原因導致的。
?
????? 在這種情況下,現有的接口需要轉化為客戶類期望的接口,這樣保證了對現有類的重用。如果不進行這樣的轉化,客戶類就不能利用現有類所提供的功能。適配器模式可以完成這樣的轉化。適配器模式建議定義一個包裝類,包裝有不兼容接口的對象。這個包裝類指的就是適配器(Adapter),它包裝的對象就是適配者(Adaptee).適配器提供客戶類需要的接口,適配器接口的實現是把客戶類的請求轉化為對適配者的相應接口的調用。換句話說:當客戶類調用適配器的方法時,在適配器類的內部調用適配者類的方法,這個過程對客戶類是透明的,客戶類并不直接訪問適配者類。因此,適配器可以使由于借口不兼容而不能交互的類可以一起工作。

適配器總體上可以分為兩類:類適配器( Class?Adapter) 和對象適配器 (Object?Adapter)

adapter.bmp

類適配器:

目標角色:

package ?adapter;
public ?? interface ?Target {
????
// 源類中也有該方法
???? void ?sampleOperator1();
????
// 源類中無該方法
???? void ?sampleOperator2();
}

源角色:

package ?adapter;
public ? class ?Adaptee {
????
// 源類中只有方法sampleOperator1
???? public ? void ?sampleOperator1() {}
}

適配器角色:

package ?adapter;
public ? class ?Adapter? extends ?Adaptee? implements ?Target {
????
// 由于源類中沒有方法sampleOperator2
????
// 所以在配置器類中補上
???? public ? void ?sampleOperator2() {}
}


對象適配器:

目標角色和源角色與類適配器一樣,適配器角色如下:

package ?adapter;
public ? class ?Adapter?? implements?Target{

????
private?Adaptee?adaptee;
????
????
public?Adapter(Adaptee?adaptee){
????????
this.adaptee=adaptee;
????}

????
????
//源類中有方法sampleOperator1
????
//在適配器中直接委派
????public?void?sampleOperator1(){
????????adaptee.sampleOperator1();
????}

????
????
//源類中沒有方法sampleOperator2
????
//在適配器類中給補上
????public?void?sampleOperator2(){
????????
//具體實現
????}

}

參考資料:http://www.javaresearch.org/article/showarticle.jsp?column=31&thread=39863
?《Java與模式》