GOF《設計模式》一書對Adapter模式是這樣描述的:
將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使原本由于接口不兼容而不能一起工作的類可以一起工作。
圖解 :


這段話大致是說:我們需要一種方式,為一個功能正確但接口不合的對象創建一個新接口。例如,客戶給我們如下需求:
1) 為都有“顯示”(display)行為的點、線、正方形分別創建類。
2) 客戶對象不必知道自己到底擁有點、線、還是正方形。它只需知道擁有這些形狀中的一個。
也就是說,我們要用一個更高層次的概念將這些具體形狀都涵蓋進去,這個高層概念可以稱為:“可顯示的形狀”。因此,我們需要創建一個接口Shape:
interface Shape{
publicvoid display();
}
現在客戶忽然間有讓我們給這個系統增加一個畫圓的功能。這個看起來很簡單,只需定義一個Circle類來實現Shape接口,但是我們要給它編寫display方法,這可不是件簡單的事,假如此時我們正好發現一個XXCircle類,它有一個方法剛好可以完成這個功能,那么有沒有更好的方法來利用它呢,這時我們就要用到Adapter模式了。XXCircle代碼如下:
class XXCircle{
public void displayCircle(){
System.out.println("通過XXCircle.displayCircle()畫圓");
}
}
Adapter模式有兩種類型:
1) 對象Adapter模式,它依賴于一個對象(適配器)包含另一個對象(被適配的對象)。
class CircleObject implements Shape{
public XXCircle circle;
public CircleObject(XXCircle xxcircle){
circle=xxcircle;
}
public void display() {
circle.displayCircle();
}
}
public class Client {
public static void main(String[] args) {
XXCircle circle=new XXCircle();
CircleObject co=new CircleObject(circle);
co.display();
}
}
2) 類Adapter模式,它是通過多重繼承來實現的(java中沒有多繼承,是通過接口來實現的)。
class CircleClass extends XXCircle implements Shape{
public void display() {
super.displayCircle();
}
}
public class Client {
public static void main(String[] args) {
CircleClass cc=new CircleClass();
cc.display();
}
}
小結:Adapter模式是一個很常用的模式,它將一個(或多個)類的接口轉換成我們需要類所具備的一個接口。它的實現方式是:創建一個具備所需接口的類,然后包裝原有類的方法,這樣實際上就包含了被適配的對象。它主要適用于以下幾種情況:
1) 你希望使用他人編寫的子程序或方法,因為你需要它所執行的功能。
2) 你無法將這個子程序直接加入程序中。
3) 子程序的接口或調用方式與需要使用它的相關對象不完全相同。