適配器模式:將不兼容的接口轉(zhuǎn)換為可兼容的接口
什么是適配器模式?
適配器模式是一種結(jié)構(gòu)型設(shè)計模式,用于將一個類的接口轉(zhuǎn)換為客戶端所期望的另一個接口
。它允許不兼容的類能夠合作,使得原本由于接口不匹配而無法工作的類能夠一起工作
。
適配器模式通過創(chuàng)建一個適配器類,將原本不兼容的接口轉(zhuǎn)換為目標接口,從而使得客戶端能夠使用目標接口來調(diào)用適配器類。適配器類實現(xiàn)了目標接口,并在內(nèi)部持有一個原本不兼容的類的實例,通過適配器類的方法來調(diào)用原本不兼容類的方法。
優(yōu)缺點
優(yōu)點
- 兼容性:適配器模式可以解決不同類之間接口不兼容的問題,使得原本無法合作的類能夠一起工作。
- 復(fù)用性:適配器模式可以復(fù)用已有的類,通過適配器類來使用這些類,而無需修改原有代碼。
- 靈活性:適配器模式可以在不修改原有代碼的情況下,通過適配器類來擴展功能或修改行為。
缺點: 過多地使用適配器,會讓系統(tǒng)非常零亂,不易整體進行把握
。比如,明明看到調(diào)用的是 A 接口,其實內(nèi)部被適配成了 B 接口的實現(xiàn),一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對系統(tǒng)進行重構(gòu)。
示例
假設(shè)我們要給手機充電,該手機充電的電壓只支持4v,現(xiàn)在電源電壓是220v,為了能夠給手機充電,我們可以使用適配器模式,將電壓轉(zhuǎn)為為4v。
目標類:手機
public class Phone {
// 充電
public void chargin(IVoltage5V iVoltage5V) {
if (iVoltage5V.output5V() == 5) {
System.out.println("電壓為5V,可以充電~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("電壓大于5V,不能充電");
}
}
}
原本不兼容的類:220V電源插座
// 被適配器類
public class Voltage220V {
public int output220V() {
int src = 220;
System.out.println("電壓=220V");
return src;
}
}
適配器接口
public interface IVoltage5V {
public int output5V();
}
適配器類:220V電源適配器
// 適配器類
public class VotageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V() {
int srcV = output220V(); // 獲取220V電壓
int dstV = srcV / 44; // 轉(zhuǎn)成5V電壓
return dstV;
}
}
客戶端代碼
public class Client {
public static void main(String[] args) {
System.out.println("-------使用類適配器------------");
Phone phone = new Phone();
phone.chargin(new VotageAdapter());
}
}
源碼分析
Java IO中,InputStreamReader
和 OutputStreamWriter
就是兩個適配器(Adapter),它們兩個是字節(jié)流和字符流之間的橋梁。InputStreamReader
使用 StreamDecoder
(流解碼器)對字節(jié)進行解碼,實現(xiàn)字節(jié)流到字符流的轉(zhuǎn)換, OutputStreamWriter
使用StreamEncoder
(流編碼器)對字符進行編碼,實現(xiàn)字符流到字節(jié)流的轉(zhuǎn)換。
// InputStreamReader 是適配器,F(xiàn)ileInputStream 是被適配的類
InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
InputStreamReader部分源碼:文章來源:http://www.zghlxwxcb.cn/news/detail-646452.html
public class InputStreamReader extends Reader {
//用于解碼的對象
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
// 獲取 StreamDecoder 對象
sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
// 使用 StreamDecoder 對象做具體的讀取工作
public int read() throws IOException {
return sd.read();
}
}
總結(jié)
適配器模式是一種非常有用的設(shè)計模式,它可以解決不兼容的接口問題,使得原本無法合作的類能夠一起工作。通過創(chuàng)建一個適配器類,將原本不兼容的接口轉(zhuǎn)換為目標接口,適配器模式提供了一種靈活、可復(fù)用的方式來擴展功能或修改行為。在實際開發(fā)中,適配器模式經(jīng)常被用于集成不同系統(tǒng)或庫之間的接口,以實現(xiàn)系統(tǒng)的互操作性和可擴展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-646452.html
到了這里,關(guān)于適配器模式:將不兼容的接口轉(zhuǎn)換為可兼容的接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!