一、簡介
Adapter模式就是把一個接口變換使用者所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
從實現(xiàn)方式上,可分為:類的適配器模式和對象的適配器模式
Adapter模式有三個角色:
1. 目標(biāo)(Target)角色:這就是所期待得到的接口。
2. 源(Adapee)角色:現(xiàn)在需要適配的接口。
3. 適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉(zhuǎn)換成目標(biāo)接口。
二、類的適配器模式
通過繼承方式實現(xiàn),因此Target需是接口。
2.1實現(xiàn)
1.Target
<code>public interface Target {
/** * 這是Adaptee也有的方法 /
public void original();
/* * 這是新添加的方法 /
public void newMothed();
}</code>
2.Adapee
<code>public class Adaptee {
public void original(){}
}</code>
3.Adapter
<code>public class Adapter extends Adaptee implements Target {
/* * 適配方法 */
@Override public void newMothed()
{
//寫相關(guān)的代碼
}
}</code>
三、對象的適配器模式
使用組合方式實現(xiàn)
3.1 實現(xiàn)
Target和Adapee和2.1的一樣
3.Adapter
<code>public class Adapter {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
/** 調(diào)用Adaptee方法/
public void original(){
this.adaptee.sampleOperation1();
}
/** * 適配方法 */
public void newMothed(){
//寫相關(guān)的代碼
}
}</code>
四、總結(jié)
4.1 類適配器和對象適配器的權(quán)衡
1.類適配器使用繼承的方式,使得適配器不能和Adaptee的子類一起工作;對象適配器使用組合的方式,可以把源類和它的子類都適配到目標(biāo)接口。
2.類適配器可以通過重寫Adaptee的方法,進(jìn)行重定義;對象適配器要想實現(xiàn)此功能,需要適配進(jìn)行重寫的Adaptee子類。
建議:盡量使用對象適配器的實現(xiàn)方式,多用組合、少用繼承。
4.2 適配器模式的優(yōu)缺點
1.優(yōu)點
更好的復(fù)用性:系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。那么通過適配器模式就可以讓這些功能得到更好的復(fù)用。
更好的擴(kuò)展性:可以調(diào)用已開發(fā)的功能,從而自然地擴(kuò)展系統(tǒng)的功能。
2.缺點
過多的使用適配器,會讓系統(tǒng)非常零亂。
五、缺省適配模式
缺省適配(Default Adapter)模式為一個接口提供缺省實現(xiàn),這樣子類型可以從這個缺省實現(xiàn)進(jìn)行擴(kuò)展,而不必從原有接口進(jìn)行擴(kuò)展。作為適配器模式的一個特例,缺省是適配模式在JAVA語言中有著特殊的應(yīng)用。
5.1 實現(xiàn)
1.接口
<code>public interface AbstractService {
public void mothed1();
public int mothed2();
public String mothed3();
}</code>
2.缺省適配
<code>public class ServiceAdapter implements AbstractService{
@Override
public void mothed1() {
}
@Override
public int mothed2() {
return 0;
}
@Override
public String mothed3() {
return null;
}
}</code>
3.實現(xiàn)者
<code>public class AImpl exthends ServiceAdapter{
//根據(jù)需要,進(jìn)行實現(xiàn)
@Override
public String mothed3() {
return null;
}
}</code>