適配器模式
1. 分析
-
定義
將一個類的接口(被適配者)
轉換成客戶期望的另一個接口(目標類)
使原本接口不兼容的類可以一起工作 -
類型
結構型
-
適用場景
已經存在的類,它的方法和需求不匹配時(方法結果相同或相似)不是軟件設計階段考慮的設計模式,是隨着軟件維護,由於不同產品、不同廠家造成功能類似而接口不相同情況下的解決方案
-
優點
能提高類的透明性和複用,現有的類複用但不需要改變目標類和適配器類解耦,提高程序擴展性
符合開閉原則
-
缺點
適配器編寫過程需要全面考慮,可能會增加系統的複雜性增加系統代碼可讀的難度
-
擴展
-
對象適配器:符合組合複用原則,使用委託機制
-
類適配器:通過類繼承實現
-
-
模式比較
適配器模式與外觀模式:
- 都是對現有的類,現存的系統的封裝
- 外觀模式定義了新的接口,適配器模式複用原有的接口
- 適配器模式是使兩個已有的接口協同工作,外觀模式是在現有的接口中提供一個更爲方便的訪問入口
- 二者適配力度不同,外觀模式用來適配整個子系統,即外觀模式所針對的對象粒度更大
2. 示例
2.1 類適配
public class Adaptee {
public void adapteeRequest(){
System.out.println("被適配者的方法");
}
}
public interface Target {
void request();
}
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget 目標方法");
}
}
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
2.2 對象適配
public class Adaptee {
public void adapteeRequest(){
System.out.println("被適配者的方法");
}
}
public interface Target {
void request();
}
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget 目標方法");
}
}
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
3. 源碼
javax.xml.bind.annotation.adapters.XmlAdapter
org.springframework.aop.framework.adapter.AdvisorAdapter
org.springframework.web.servlet.HandlerAdapter