Adapter(擴充卡)
意圖:将一個類的接口轉換成客戶希望的另一個接口。Adapter模式使得原本由于接口不相容而不能一起工作的那些類可以一起工作。
在以下情況可以使用
- 你想使用一個已存在的類,而他的接口不符合你的需求
- 你想建立一個可以複用的類,該類可以與其他不相幹的類或不可預見的類(及那些接口可能不一定相容的類)協同工作。
- 你想使用一些已經存在 的子類,但是不可能對每一個都進行子類化以比對它們的接口。對象擴充卡可以适配他的父類接口。
擴充卡即在另一個不相關(接口不相容)的系統中使用該類。
類擴充卡
一般使用多繼承來實作,java可以用繼承一個類并實作另一個接口來實作。
有一個系統隻能使用 有getA() 方法的類,B類隻有 getB() ,我們可以用一個擴充卡(BtoA)來使他們相容
A類頂層接口
public interface A {
void doA();
}
B類
public class B {
public B() {
}
public void doB(){
System.out.println("doB");
}
}
擴充卡
public class BtoA extends B implements A{
@Override
public void doA() {
doB();
System.out.println("doA");
}
}
public class Main {
public static void main(String[] args) {
B btoA = new BtoA();
((BtoA) btoA).doA();
}
}
對象擴充卡
類擴充卡一般都是用繼承來實作,對象擴充卡用對象組合的方式實作。
public class BtoA extends B implements A {
private B b;
public BtoA() {
this.b = new B();
}
@Override
public void doA() {
b.doB();
}
}
相關模式
模式Bridge的結構與對象擴充卡類似,但是Bridge模式的出發點不同:Bridge的目的是将接口部分和實作部分分離,進而可以對它們較為容易也相對獨立的加以改變。而Adapter則意味着改變一個已有對象的接口。
Decorator模式增強了其他對象的功能而同時又不改變它的接口,是以Decorator對應用程式的透明性比擴充卡要好。結果是Decorator支援遞歸組合,而純粹使用擴充卡是不可能實作這一點的。
模式Proxy在不改變他的接口的條件下,為另一個對象定義了一個代理。