說明:本文介紹設計模式中結構型設計模式中的,適配器模式;
插頭轉換器
適配器模式屬于結構型設計模式,設計思想體現在結構上的。以插頭轉換器為例,當你需要給手機充電,但是眼前只有一個三孔插座,二腳充電器無法使用三孔插座。
這時如果有一個插頭轉換器,可以將二孔插頭轉為三腳插頭,就可以解決眼前問題。這個轉換器扮演的就是適配器的角色。如下:
(TwoPin,二腳插座接口,只提供二腳插頭充電)
/*** 二腳插座*/
public interface TwoPin {/*** 二腳充電*/public void charge(int l, int r);
}
(ThreePin,三腳插座接口,只提供三腳插頭充電)
/*** 三腳插座*/
public interface ThreePin {/*** 三腳充電*/public void charge(int l, int r, int g);
}
(Phone,手機,充電器屬于二腳插頭)
/*** 手機*/
public class Phone implements TwoPin{@Overridepublic void charge(int l, int r) {System.out.println("手機充電中..." + l + "====" + r);}
}
(客戶端類,演示手機充電過程,二孔插頭無法插入三孔插座,類型錯誤)
為了解決上面問題,我們可以創建一個適配器類,用來適配手機類使用三孔插座,如下:
/*** 適配器*/
public class Adapter implements ThreePin{/*** 適配器持有手機對象*/private Phone phone;/*** 適配手機使用三腳插座* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {phone.charge(l, r);}
}
(Client,客戶端,演示手機使用三腳插座)
/*** 客戶端*/
public class Client {public static void main(String[] args) {// 借助適配器,手機使用三腳插座充電Phone phone = new Phone();new Adapter(phone).charge(1, 1, 0);}
}
借助適配器,手機就可以使用三腳插座了;
專屬適配器
當我們想讓該適配器專屬于手機,而不給其他類使用時,我們可以通過繼承的方式來實現。
如下:
(Phone,手機類,給手機一個name屬性,表示手機的名稱)
/*** 手機*/
public class Phone implements TwoPin{/*** 手機名稱*/protected String name;public Phone(String name) {this.name = name;}@Overridepublic void charge(int l, int r) {System.out.println(name + ":手機充電中..." + l + "====" + r);}
}
(PhoneAdapter,手機專屬適配器,繼承于手機,實現三腳插座接口)
/*** 手機專屬適配器*/
public class PhoneAdapter extends Phone implements ThreePin{/*** 適配器持有手機對象*/private Phone phone;public PhoneAdapter(Phone phone) {super(phone.name);this.phone = phone;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":在使用專屬的適配器給手機充電...");super.charge(l, r);}
(Client,客戶端,演示小米手機使用手機專屬的適配器,用三孔插座充電)
/*** 客戶端*/
public class Client {public static void main(String[] args) {// 小米手機使用手機專屬的適配器,用三孔插座充電Phone phone = new Phone("小米手機");new PhoneAdapter(phone).charge(1, 1, 0);}
}
雙向適配器
雙向適配器,就是該適配器對二孔插頭、三孔插頭的充電器都可以適配,如下:
代碼實現如下:
(MultipleAdapter,多重適配器,實現兩個接口,注入兩個對象,創建對應的兩個構造方法)
/*** 多重適配器*/
public class MultipleAdapter implements ThreePin, TwoPin{/*** 三孔插座*/private ThreePin threePin;/*** 二孔插座*/private TwoPin twoPin;public MultipleAdapter(ThreePin threePin) {this.threePin = threePin;}public MultipleAdapter(TwoPin twoPin) {this.twoPin = twoPin;}/*** 三孔插座充電* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {this.twoPin.charge(l, r);}/*** 二孔插座充電* @param l* @param r*/@Overridepublic void charge(int l, int r) {this.threePin.charge(l, r, 0);}
}
(Computer,創建一個電腦類,使用三孔插座的)
/*** 電腦*/
public class Computer implements ThreePin{/*** 電腦名稱*/protected String name;public Computer(String name) {this.name = name;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":充電中..." + l + "====" + r + "====" + g);}
}
(Client,客戶端,演示手機、電腦使用多重適配器給手機充電)
/*** 客戶端*/
public class Client {public static void main(String[] args) {// 電腦使用多重適配器,用二孔插座充電Computer computer = new Computer("聯想電腦");new MultipleAdapter(computer).charge(1,1);// 手機使用多重適配器,用三孔插座充電Phone phone = new Phone("小米手機");new MultipleAdapter(phone).charge(1,1,0);}
}
(不論是二孔插頭還是三孔插頭,都行)
以上就是適配器模式的內容,適配的思想還是非常常見的,在Java中,方法重載不正是適配器模式在方法上的一種體現嗎?而適配器模式,是在類的層面上,對多種類、對象之間的一種適配。
總結
本文參考《設計模式的藝術》、《秒懂設計模式》兩書