概述
在生活中如果兩個不同語言的人怎麼溝通呢?翻譯器。電源有二相插座,但是你是三相插頭,那你怎麼充電呢?插座適配器。電腦要在不同的國家使用,但是每個國家的電壓標準不一樣,那你怎麼使用呢?電源適配器。這些物品就是我們適配器模式中的適配器。
概念
適配器模式定義:適配器模式將一個類的接口,轉換成客戶期望的另一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作
Client:客戶端
Target:目標接口
Adapter:適配器
Adaptee:被適配類
在我們適用ListView的時候就是使用了適配器模式
適配器模式代碼實現
我們就用插座適配器來舉例吧。那我們的客戶端是什麼呢?電腦,目標接口:三相接口,適配器:電源適配器,被適配類:二相電流。
ThreePlugIf.java
package com.xjh.adapter;
/*
* 三相插座接口(被適配類)
*/
public interface ThreePlugIf {
//使用三相電流供電
public void powerWithThree();
}
GBTwoPlug.java
package com.xjh.adapter;
/*
* 使用國標二相電流(目標接口)
*/
public class GBTwoPlug {
//使用二相電流供電
public void powerWithTwo() {
System.out.println("使用二相電流供電");
}
}
我們讓適配器實現ThreePlugIf接口,然後在內部擁有GBTwoPlug的引用(初始化時傳入),在ThreePlugIf接口的powerWithThree方法中調用GBTwoPlug的powerWithTwo方法。
TwoPlugAdapter.java
package com.xjh.adapter;
/**
* 二相轉三相的插座適配器
* @author Gin
*
*/
public class TwoPlugAdapter implements ThreePlugIf {
private GBTwoPlug plug;
public TwoPlugAdapter(GBTwoPlug plug) {
this.plug = plug;
}
@Override
public void powerWithThree() {
// TODO Auto-generated method stub
System.out.println("通過轉換");
plug.powerWithTwo();
}
}
NoteBook.java
package com.xjh.adapter;
/**
* 客戶端
* @author Gin
*
*/
public class NoteBook {
private ThreePlugIf plug;
public NoteBook(ThreePlugIf plug) {
this.plug = plug;
}
//使用插座充電
public void charge() {
plug.powerWithThree();
}
}
通過父類引用可以指向子類對象的特點實現三相接口使用二相插座。
Test.java
package com.xjh.adapter;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
GBTwoPlug two = new GBTwoPlug();
ThreePlugIf plug = new TwoPlugAdapter(two);
NoteBook nb = new NoteBook(plug);
nb.charge();
}
}
這樣我們通過適配器的轉換就能夠使得效果的到實現了,這就是我們通過組合實現適配器模式的過程。
採用組合方式實現的適配器稱爲對象適配器,特點:把“被適配者”作爲一個對象組合到適配器類中,以修改目標接口包裝被適配類。
那如果我們要用繼承怎麼實現呢?就是繼承至被適配者,並且實現目標接口。
TwoPlugAdapterExtends.java
package com.xjh.adapter;
/**
* 採用繼承方式的插座適配器
* @author Gin
*
*/
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {
@Override
public void powerWithThree() {
// TODO Auto-generated method stub
System.out.println("藉助繼承適配器");
this.powerWithTwo();
}
}
然後我們總結new出這個Adapter就可以了。
Test.java
package com.xjh.adapter;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
GBTwoPlug two = new GBTwoPlug();
ThreePlugIf plug = new TwoPlugAdapterExtends();
NoteBook nb = new NoteBook(plug);
nb.charge();
}
}
通過繼承的方式實現適配器稱爲類適配器,特點:通過多重繼承不兼容接口,實現對目標接口的匹配,單一的爲某個類而實現適配。
但是這兩種的實現是有什麼區別呢,通過對象適配器實現的服務於被適配類的所有子類,但是類適配器模式通過多重繼承不兼容接口,實現對目標接口的匹配,單一的爲某個類而實現適配的這樣一種模式。
優點
- **透明:**通過適配器,客戶端可以調用同一接口,因而對客戶端來說是透明的
- **重用:**複用了現存的類,解決了現存類和複用環境要求不一致的問題
- **低耦合:**將目標類和適配者類解耦,通過引入一個適配器類重用現有的適配者類,而無需修改原有代碼。