目錄
- 類適配器
- 對象適配器
- 兩種適配器的選擇
- 使用場景
類適配器
下面我們使用Mac電腦和U盤適配的一個簡單實例來了解類適配器的實現方式。
首先創建一個Mac的接口有讀寫的數據的功能
public interface MacInterface {
void write(String msg);
String read();
}
然後有一個u盤的實例
public class UDisk {
public void byWrite(String msg){
System.out.println(msg);
}
public String byRead(){
return "拜登家譜";
}
}
但是mac接口直接連接u盤所以我們給它增加一個適配器,通過適配器連接兩者。
public class MacUsbAdaptor extends UDisk implements MacInterface{
@Override
public void write(String msg) {
super.byWrite(msg);
}
@Override
public String read() {
return super.byRead();
}
}
public class AdaptorTest {
@Test
public void test(){
MacInterface macInterface = new MacUsbAdaptor();
System.out.println(macInterface.read());
macInterface.write("川普私密照片");
}
}
=====結果=====
拜登家譜
川普私密照片
對象適配器
使用和上面相同的實例,通過組合的方式來實現對象適配器。
public interface MacInterface {
void write(String msg);
String read();
}
public class UDisk {
public void byWrite(String msg){
System.out.println(msg);
}
public String byRead(){
return "拜登家譜";
}
}
public class MacUsbAdaptor implements MacInterface {
private UDisk disk;
public MacUsbAdaptor(UDisk disk) {
this.disk = disk;
}
@Override
public void write(String msg) {
//適配過程中肯定涉及到一些 “適配” 的過程,比如説統一格式
disk.byWrite(msg);
}
@Override
public String read() {
return disk.byRead();
}
}
public class AdaptorTest {
@Test
public void test(){
MacInterface macInterface = new MacUsbAdaptor(new UDisk());
System.out.println(macInterface.read());
macInterface.write("川普私密照片");
}
}
=====結果=====
拜登家譜
川普私密照片
兩種適配器的選擇
- 被適配的類(如UDisk)的接口(類裏面的方法)不多,兩者都可以
- 被適配的類的接口較多而且接口大多數都需要和接口類(如 MacInterface)中的方法適配,那麼可以選擇類適配器,這樣可以複用被適配類中的方法,節省代碼量。
- 被適配的類的接口較多而且其接口和接口類(如 MacInterface)中的方法適配的不多,那麼可以選擇對象適配器,組合相對於繼承更加靈活。
使用場景
- 原有接口無法修改但又必須快速兼容新接口
- 不同數據格式、協議之間的轉換
- 需要使用外部組件組合成新組件來提供功能,而又不想重複開發部分功能