定義與類型
- 定義:將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口
- 使原本接口不兼容的類可以一起工作
- 類型:結(jié)構(gòu)型
適用場景
- 已經(jīng)存在的類,它的方法和需求不匹配時(方法結(jié)果相同或相似)
- 不是軟件設(shè)計階段考慮的設(shè)計模式,是隨著軟件維護(hù),由于不同產(chǎn)品、不同廠家造成功能類似而接口不同情況下的解決方案
優(yōu)點
- 能夠提高類的透明性和復(fù)用,現(xiàn)有類復(fù)用但不需要改變
- 目標(biāo)類和適配器類解耦,提高程序擴(kuò)展性
- 符合開閉原則
缺點
- 適配器編寫過程需要全面考慮,可能會增加系統(tǒng)的復(fù)雜性
- 增加系統(tǒng)代碼可讀的難度
擴(kuò)展
- 對象適配器
- 類適配器
相關(guān)設(shè)計模式
- 適配器模式和外觀模式
代碼演示
類適配器
- 創(chuàng)建被適配者
/**
* @author lijiayin
*/
public class Adaptee {
public void adapteeRequest(){
System.out.println("被適配者的方法");
}
}
- 創(chuàng)建需要適配的接口
/**
* @author lijiayin
*/
public interface Target {
void request();
}
- 創(chuàng)建適配器
/**
* @author lijiayin
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
- 測試一下
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
-
測試結(jié)果
測試結(jié)果.png -
UML圖
UML.png
對象適配器
- 修改Adapter類
/**
* @author lijiayin
*/
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
-
測試一下
測試結(jié)果.png -
UML圖
UML.png
將220V交流電轉(zhuǎn)為5V直流電
- 創(chuàng)建AC220類
/**
* @author lijiayin
*/
public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("輸出交流電" + output + "V");
return output;
}
}
- 創(chuàng)建需要實現(xiàn)的接口DC5
/**
* @author lijiayin
*/
public interface DC5 {
int outputDC5V();
}
- 創(chuàng)建適配器
/**
* @author lijiayin
*/
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
//變壓器(適配邏輯)
int adapterOutput = adapterInput / 44;
System.out.println("使用PowerAdapter,將輸入AC" + adapterInput + "V,轉(zhuǎn)為輸出DC" + adapterOutput + "V");
return adapterOutput;
}
}
- 測試一下
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
-
測試結(jié)果
測試結(jié)果.png
框架源碼
- jdk中的XmlAdapter
- spring下的AdvisorAdapter
- jpa中的JpaVendorAdapter




