1. 適配器模式:
將一個類的接口轉換成用戶希望的另外一個接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。適配器模式就類似一個橋樑的作用,把原本不兼容的接口進行合併成爲一個類。
2. 適配器模式的類別:
-
類適配器模式:通過繼承來實現適配器功能。
-
對象適配器模式:使用類的組合來實現適配器功能。
-
接口適配器模式(缺省適配器模式):增加一個橋樑,來減少工能類中的方法體。(通過抽象類來實現適配)
3. 類適配器
3.1. 類適配器的關係圖:
3.2.適配器模式包含的角色:- 目標角色: 期待所能得到的接口。注意:類適配器模式下,目標只能事接口不能是類。
- 源角色: 需要被適配的對象。
- 適配器角色: 適配器角色是本模式的關鍵。適配器負責把源接口轉換爲目標接口。這一角色只能是類不能是接口。
3.3. 類適配器模式的示例代碼:
場景:現在市面的共享充電器既有type-c接口,又有lighting接口。
目標角色:
public interface Charger {
//typeC接口
void typeCInterface();
//lighting接口
void lightingInterface();
}
源角色:
public class TypeC {
public void typeCInterface(){
System.out.println("我只有TypeC接口....");
}
}
適配器角色:
public class InterfaceAdapter extends TypeC implements Charger {
@Override
public void lightingInterface() {
System.out.println("我有Lighting接口");
}
}
測試主函數:
public class Main {
public static void main(String[] args) {
Charger charger = new InterfaceAdapter();
charger.lightingInterface();
charger.typeCInterface();
}
}
將以上適配器改成對象適配器,只需要修改適配器源碼如下:
public class ObjInterfaceAdapter implements Charger {
private TypeC typeC;
public ObjInterfaceAdapter(TypeC typeC) {
this.typeC = typeC;
}
@Override
public void typeCInterface() {
typeC.typeCInterface();
}
@Override
public void lightingInterface() {
System.out.println("我有Lighting接口");
}
}
測試主函數:
public class Main {
public static void main(String[] args) {
Charger charger1 = new ObjInterfaceAdapter(new TypeC());
charger1.typeCInterface();
charger1.lightingInterface();
}
}
類適配器模式與對象適配器模式的區別:
- 類適配器模式是靜態的對象集成方式。而對象適配器是使用傳入對像的動態組合的方式,靈活性相對較高。
- 由於類適配器是直接集成被適配角色,因此這個適配器就不能去處理被適配器角色的子類。而對象適配器可以把多種不同的源匹配到一個目標中,也就避免了類適配的不能處理被適配角色的子類的問題。
- 相對於類適配器來說,對象適配器新增行爲更具靈活方便,所以這裏推薦用對象適配器,但是具體情況還是需要具體對待。
5. 接口適配器
在類適配器和對象適配器之外還有一種接口適配器(缺省適配器); 這種適配器模式的主要目的是簡化類中的方法,因爲如果一個類要去實現接口的情況下,就必須實現接口中所有的方法,有可能會遇到其實只需要使用類中的某幾個方法,這樣會導致實現類的臃腫,可以通過這種辦法來做簡化。這種方法的實現其實是使用一個抽象類去實現接口,實現後然後真正使用方法的類則去繼承這個抽象類,這樣就不需要所有方法都去實現了。
這裏使用僞代碼進行解釋:
接口:
public interface AbsInterface {
void method1();
void method2();
void method3();
void method4();
}
如果我們要使用接口中的方法,如果直接使用實現接口的方式,那麼實現的類中就會有很多的方法,顯得很臃腫。而我們又只需要其中的method2和method3這個兩個方法,那麼,只需要再添加一個抽象類去實現這個接口。
抽象類如下:
public abstract class InterAdapter implements AbsInterface {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
}
}
接下來我們只需要去繼承這個抽象類,然後從抽象類中調用我們需要的方法即可:
代碼如下:
public class Target extends InterAdapter{
@Override
public void method3() {
System.out.println(">>>>>>method3");
}
}
測試主函數:
public class Main {
public static void main(String[] args) {
AbsInterface absInterface = new Target();
absInterface.method3();
}
}
6. 適配器模式的優缺點:
優點:
1. 可以讓任何沒有聯繫的兩個類一起使用。
2. 對系統中的類有更好的複用性。也就是說如果系統需要使用現有類,但是現有的類又不符合接口的要求,可以使用適配器進行適配,讓這些功能得到更好的複用。
3. 提供系統的擴展性.使用適配器可以很簡單的調用自己開發的功能,自然而然的擴展系統功能。
缺點:
當然適配器功能的缺點也很明顯,過多的適配器會讓系統非常凌亂。