GOF《設(shè)計(jì)模式》一書對(duì)Adapter模式是這樣描述的:
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使原本由于接口不兼容而不能一起工作的類可以一起工作。
這段話大致是說:我們需要一種方式,為一個(gè)功能正確但接口不合的對(duì)象創(chuàng)建一個(gè)新接口。例如,客戶給我們?nèi)缦滦枨螅?/span>
1) 為都有“顯示”(display)行為的點(diǎn)、線、正方形分別創(chuàng)建類。
2) 客戶對(duì)象不必知道自己到底擁有點(diǎn)、線、還是正方形。它只需知道擁有這些形狀中的一個(gè)。
也就是說,我們要用一個(gè)更高層次的概念將這些具體形狀都涵蓋進(jìn)去,這個(gè)高層概念可以稱為:“可顯示的形狀”。因此,我們需要?jiǎng)?chuàng)建一個(gè)接口Shape:
interface Shape{
publicvoid display();
}
現(xiàn)在客戶忽然間有讓我們給這個(gè)系統(tǒng)增加一個(gè)畫圓的功能。這個(gè)看起來很簡單,只需定義一個(gè)Circle類來實(shí)現(xiàn)Shape接口,但是我們要給它編寫display方法,這可不是件簡單的事,假如此時(shí)我們正好發(fā)現(xiàn)一個(gè)XXCircle類,它有一個(gè)方法剛好可以完成這個(gè)功能,那么有沒有更好的方法來利用它呢,這時(shí)我們就要用到Adapter模式了。XXCircle代碼如下:
class XXCircle{
public void displayCircle(){
System.out.println("通過XXCircle.displayCircle()畫圓");
}
}
Adapter模式有兩種類型:
1) 對(duì)象Adapter模式,它依賴于一個(gè)對(duì)象(適配器)包含另一個(gè)對(duì)象(被適配的對(duì)象)。
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模式,它是通過多重繼承來實(shí)現(xiàn)的(java中沒有多繼承,是通過接口來實(shí)現(xiàn)的)。
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();
}
}
小結(jié):Adapter模式是一個(gè)很常用的模式,它將一個(gè)(或多個(gè))類的接口轉(zhuǎn)換成我們需要類所具備的一個(gè)接口。它的實(shí)現(xiàn)方式是:創(chuàng)建一個(gè)具備所需接口的類,然后包裝原有類的方法,這樣實(shí)際上就包含了被適配的對(duì)象。它主要適用于以下幾種情況:
1) 你希望使用他人編寫的子程序或方法,因?yàn)槟阈枰鶊?zhí)行的功能。
2) 你無法將這個(gè)子程序直接加入程序中。
3) 子程序的接口或調(diào)用方式與需要使用它的相關(guān)對(duì)象不完全相同。