基本介紹
適配器模式將某個類的接口轉換成客戶端期望的另一個接口表示,主要目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協同工作。
適配器模式屬於結構性模式,主要分為三類:類適配器模式、對象適配器模式、接口適配器模式。

類適配器模式
什么是類適配器模式
類適配器模式介紹:Adapter類,通過集成src類,實現dst類接口,完成src>dst的適配。
應用實例
案例
以生活中充電器的例子來講解適配器,充電器本身相當於Adapter,220V交流電相當於src(即被適配者),我們的dst(即目標)是5V直流電。
思路分析

代碼實現
1//被適配的類
2public class Voltage220V {
3 //輸出220V的電壓
4 public int output220V(){
5 int src=220;
6 System.out.println("電源電壓="+src+"伏");
7 return src;
8 }
9}
1//適配接口
2public interface IVoltage5V {
3 int output5V();
4}
1public class VoltageAdapter extends Voltage220V implements IVoltage5V {
2 @Override
3 public int output5V() {
4 int srcV = output220V();//獲取220V的電壓
5 int dstV = srcV / 44;//進行處理
6 return dstV;
7 }
8}
1public class Phone {
2 //充電
3 public void charging(IVoltage5V iVoltage5V){
4 if (iVoltage5V.output5V()==5){
5 System.out.println("現在電壓為5V,可以充電");
6 }else if (iVoltage5V.output5V()>5){
7 System.out.println("現在電壓大於5V,可以充電");
8 }
9 }
10}
1public class Client {
2 public static void main(String[] args) {
3 Phone phone = new Phone();
4 phone.charging(new VoltageAdapter());
5 }
6}
類適配器模式注意事項和細節
Java是單繼承機制,所以類適配器需要繼承src類這一點算是一個缺點,因為這要求dst必須是接口,有一定局限性。
src類的方法在Adapter中都會暴露出來,也增加了使用的成本。
由於其繼承了src類,所以它可以根據需求重寫src類的方法,使得Adapter的靈活性增強了。
對象適配器模式
什么是對象適配器模式
基本思路和類的適配器模式相同,只是將Adapter類作修改,不是繼承src類,而是持有src類的實例,以解決兼容性的問題。即:持有src類,實現dst類接口,完成src>dst的適配。
根據“合成復用原則”,在系統中盡量使用關聯關系來替代繼承關系。
對象適配器模式是適配器模式常用的一種。
應用實例
案例
以生活中充電器的例子來講解適配器,充電器本身相當於Adapter,220V交流電相當於src(即被適配者),我們的dst(即目標)是5V直流電,使用對象適配器模式完成。
思路分析

代碼實現
1public class VoltageAdapter implements IVoltage5V {
2
3 private Voltage220V voltage220V;
4
5 //通過構造器傳入
6 public VoltageAdapter(Voltage220V voltage220V) {
7 this.voltage220V = voltage220V;
8 }
9
10 @Override
11 public int output5V() {
12 int dst = 0;
13 if (null != voltage220V) {
14 int src = voltage220V.output220();
15 dst = src / 44;
16 }
17 return dst;
18 }
19}
1public class Client {
2 public static void main(String[] args) {
3 Phone phone = new Phone();
4 phone.charging(new VoltageAdapter(new Voltage220V()));
5 }
6}
對象適配器注意事項和細節
對象適配器和類適配器其實算是同一種思想,只不過實現方式不同。根據合成復用原則,使用組合替代繼承,所以它解決了類適配器必須繼承src的局限性問題,也不再要求dst必須是接口。
使用成本更低更靈活。
接口適配器模式
什么是接口適配器模式
當不需要全部實現接口提供的方法時,可先設計一個抽象類實現接口,並為該接口中每個方法提供一個默認實現(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現需求。
適用於一個接口不想使用其所有的方法的情況。
應用實例
思路分析

代碼實現
1public interface Interface4 {
2 void m1();
3 void m2();
4 void m3();
5 void m4();
6}
1//在AbsAdapter中我們將Interface4的方法進行默認實現
2public abstract class AbsAdapter implements Interface4 {
3 @Override
4 public void m1() {
5 }
6
7 @Override
8 public void m2() {
9 }
10
11 @Override
12 public void m3() {
13 }
14
15 @Override
16 public void m4() {
17 }
18}
1public class Client {
2 public static void main(String[] args) {
3 AbsAdapter absAdapter= new AbsAdapter(){
4 @Override
5 public void m1() {
6 System.out.println("使用了m1的方法");
7 }
8 };
9 absAdapter.m1();
10 }
11}
適配器模式的注意事項和細節
三種命名方式是根據src是以怎樣的形式給到Adapter(在Adapter里的形式)來命名的。
- 類適配器:以類給到,在Adapter里,將src當做類,繼承。
- 對象適配器:以對象給到,在Adapter里,將src作為一個對象,持有。
- 接口適配器:以接口給到,在Adapter里,將src作為一個接口,實現。
Adapter模式最大的作用還是將原本不兼容的接口融合到一起工作。
實際開發中,實現起來不拘泥於我們講解的三種經典形式。