大B:“我還是跟你講講類介面卡和物件介面卡吧!舉些例子,這樣你就明白了。”
小A:“好!”
大B:“要正確地區別這兩種介面卡的區別,我們還是從一個簡單的例子開始吧!我們的系統中有一個具有某個特定功能的類Adaptee,一個客戶類Client——他需要一個實現Target介面的物件,和一個Target介面。”以下是它們的原始碼:
//Adaptee.java
publicclassAdaptee{
publicvoidspecialRequest(){
System.out.println(“CalledSpecificRequest()inAdaptee”);
}
}
//Client.java
publicclassClient{
publicstaticvoidmain(String[]args){
Targett=……//newAdapter();
t.request();
}
}
//Target.java
publicinterfaceTarget{
publicvoidrequest();
}
“根據上面的分析我們知道此時需要一個Adapter物件,該物件實現Target介面,同時它又重用現有的Adaptee類。任何有一點點OO(面向物件)知識的人都會想到透過繼承可以達到重用的目的。”
下面是透過繼承實現Adaptee類重用的例子:
//Adapter.java
publicclassAdapterextendsAdapteeimplementsTarget{
publicvoidrequest(){
this.specialRequest();
}
}
大B:“看,簡單明瞭吧!現在的過程就是:客戶呼叫Target介面的request方法,實際就是呼叫其父類Adaptee的specialRequest方法。”
小A:“嘿嘿!這樣一說倒真的是簡單喔!”
大B:“對啊!這就是大家通常常說的類的介面卡!類介面卡具有以下的兩個特點:1、介面卡類(Adapter)實現Target介面;2、介面卡類(Adapter)透過繼承來實現對Adaptee類的重用。”
下面是一個透過組合關係實現繼承的例子,以下是原始碼:
//Adapter.java
publicclassAdapterimplementsTarget{
Adapteeadaptee=newAdaptee();
publicvoidrequest(){
adaptee.specialRequest();
}
}
對於這兩者不同的介面卡客戶程式碼其實是完全一樣的。以下是客戶的程式碼:
//Client.java
publicclassClient{
publicstaticvoidmain(String[]args){
Targett=newAdapter();
t.request();
}
}
大B:“現在可是全明白了吧?”
小A:“嘿嘿!現在都懂了。”