《Android源代碼設計模式解析與實戰》讀書筆記(二十)
第二十章、適配器模式
適配器模式是結構型設計模式之中的一個,它在我們的開發中使用率極高,比方ListView、GridView以及RecyclerView都須要使用Adapter。
1.定義
適配器模式把一個類的接口變換成client所期待的還有一種接口,從而使原本因接口不匹配無法在一起工作的兩個類能夠在一起工作。
2.使用場景
(1)系統須要使用現有的類。但此類的接口不符合系統的須要。即接口不兼容。
(2)想要建立一個能夠反復使用的類。用於與一些彼此之間沒有太大關聯的一些類,包含一些可能在將來引進的類一起工作。
(3)須要一個統一的輸出接口,而輸入端的類型不可預知。
3.UML類圖
適配器模式分為兩種,即類適配器模式與對象適配器模式。下面是類適配器的UML圖。
(1)Target
:目標角色。也就是所期待得到的接口。註意:因為這裏討論的是類適配器模式。因此目標不能夠是類。
(2)Adaptee
:如今須要適配的接口。
(3)Adapter
:適配器角色,也就是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不能夠是接口,而必須是詳細類。
4.簡單實現
以筆記本電源適配器為例,電源適配器將220V的電壓轉換到5V。
那麽5V電壓就是Target接口,220V電壓就是Adaptee類,轉換就是Adapter。
(1)以類適配器模式實現
//Target角色
public interface FiveVolt {
public int getVolt5();
}
//Adapter角色
public class Volt220 {
public int getVolt220(){
return 220;
}
}
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
return 5;
}
}
public class Test {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter();
System.out.println("輸出電壓:" + adapter.getVolt5());
}
}
結果:
輸出電壓:5
(2)對象適配器模式實現
對象適配器模式與類適配器模式不同的是。對象適配器模式不是使用繼承關系連接到Adapter類,而是使用代理關系連接到Adapter類。
所以FiveVolt 、Volt220 不變。VoltAdapter 改動例如以下:
public class VoltAdapter1 implements FiveVolt{
Volt220 mVolt220;
public VoltAdapter1(Volt220 adaptee) {
this.mVolt220 = adaptee;
}
public int getVolt220(){
return mVolt220.getVolt220();
}
@Override
public int getVolt5() {
return 5;
}
}
Test改動為:
public class Test {
public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter(new Volt220());
System.out.println("輸出電壓:" + adapter.getVolt5());
}
}
這樣的實現方式直接將要適配的對象傳遞到Adapter中,使用組合的形式實現接口兼容的效果。這比類適配器方式更為靈活,同一時候被適配對象的方法不會暴露出來。因此對象適配器模式更加靈活、有用。
5.Android源代碼中的適配器模式
1.ListView的Adapter
這裏ListView的Adapter就是使用的對象適配器模式,Target就是View,Adapter角色就是將Item View輸出為View抽象的角色,Adaptee就是須要被處理的Item View。
6.總結
1.長處
(1)更好的復用性:系統須要使用現有的類。而此類的接口不符合系統的須要。那麽通過適配器模式就能夠讓這些功能得到更好的復用。
(2)更好的擴展性:在實現適配器功能的時候,能夠調用自己開發的功能,從而自然地擴展系統的功能。
2.缺點
過多的使用適配器,會讓系統非常零亂,不易總體進行把握。比方,明明看到調用的是A接口,事實上內部被適配成了B接口的實現,一個系統假設太多出現這樣的情況,無異於一場災難。因此假設不是非常有必要,能夠不使用適配器,而是直接對系統進行重構。
7.參考
《JAVA與模式》之適配器模式
《Android源代碼設計模式解析與實戰》讀書筆記(二十)