使用場景:
1:替換依賴的外部系統當我們把項目中依賴的一個外部系統替換爲另一個外部系統的時候,利用適配器模式,可以減少對代碼的改動。具體的代碼示例如下所示
// 外部系統A
public interface IA {
//...
void fa();
}
public class A implements IA {
//...
public void fa() { //... }
}
// 在我們的項目中,外部系統A的使用示例
public class Demo {
private IA a;
public Demo(IA a) {
this.a = a;
}
//...
}
Demo d = new Demo(new A());
// 將外部系統A替換成外部系統B
public class BAdaptor implemnts IA {
private B b;
public BAdaptor(B b) {
this.b= b;
}
public void fa() {
//...
b.fb();
}
}
// 藉助BAdaptor,Demo的代碼中,調用IA接口的地方都無需改動,
// 只需要將BAdaptor如下注入到Demo即可。
Demo d = new Demo(new BAdaptor(new B()));
2. 兼容老版本接口在做版本升級的時候,對於一些要廢棄的接口,我們不直接將其刪除,而是暫時保留,並且標註爲 deprecated,並將內部實現邏輯委託爲新的接口實現。這樣做的好處是,讓使用它的項目有個過渡期,而不是強制進行代碼修改。這也可以粗略地看作適配器模式的一個應用場景。同樣,我還是通過一個例子,來進一步解釋一下。JDK1.0 中包含一個遍歷集合容器的類 Enumeration。JDK2.0 對這個類進行了重構,將它改名爲 Iterator 類,並且對它的代碼實現做了優化。但是考慮到如果將 Enumeration 直接從 JDK2.0 中刪除,那使用 JDK1.0 的項目如果切換到 JDK2.0,代碼就會編譯不通過。爲了避免這種情況的發生,我們必須把項目中所有使用到 Enumeration 的地方,都修改爲使用 Iterator 纔行。單獨一個項目做 Enumeration 到 Iterator 的替換,勉強還能接受。但是,使用 Java 開發的項目太多了,一次 JDK 的升級,導致所有的項目不做代碼修改就會編譯報錯,這顯然是不合理的。這就是我們經常所說的不兼容升級。爲了做到兼容使用低版本 JDK 的老代碼,我們可以暫時保留 Enumeration 類,並將其實現替換爲直接調用 Itertor。代碼示例如下所示
public class Collections {
public static Emueration emumeration(final Collection c) {
return new Enumeration() {
Iterator i = c.iterator();
public boolean hasMoreElments() {
return i.hashNext();
}
public Object nextElement() {
return i.next():
}
}
}
}