正文
一、定義
適配器模式將一個類的接口(被適配者),轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
要點:
- 適配器實現了目標接口,並持有被適配者的實例。
- 適配器使用被適配者的方法,把請求轉換成被適配者的一個或多個方法。
- 客戶通過目標接口調用適配器的方法對適配器發出請求。
- 客戶與被適配者是解耦的,一個不知道另一個。
- 當需要使用一個現有的類而其接口並不符合你的需要時,就使用適配器。
二、實現步驟
1、創建被適配者接口
/**
* 被適配者接口
*/
public interface Adaptee {
public void specificRequest();
}
2、創建具體的被適配者,並實現被適配者接口
/**
* 具體的被適配者
*/
public class ConcreteAdaptee implements Adaptee {
@Override
public void specificRequest() {
System.out.println("ConcreteAdaptee is doing something...");
}
}
3、創建目標接口
/**
* 目標接口
*/
public interface Target {
public void request();
}
4、創建適配器類,並實現目標接口
適配器持有被適配者,並在收到請求時調用被適配者的方法。
/**
* 適配器
*/
public class Adapter implements Target {
/**
* 被適配者
*/
Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
// 調用被適配者方法
adaptee.specificRequest();
}
}
5、使用適配器轉換被適配者
public class Test {
public static void main(String[] args) {
// 被適配者
Adaptee adaptee = new ConcreteAdaptee();
// 適配器
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
}
三、舉個栗子
1、背景
你上班的公司做了一套模擬鴨子游戲。現在,假設你缺鴨子對象,想用一些火雞對象來冒充。
顯而易見,因爲火雞的接口不同,所以我們不能公然拿來用。
2、實現
使用適配器把火雞的方法轉換成鴨子的方法,這樣表面上看起來就像是一隻鴨子了。
(1)創建火雞接口
/**
* 火雞接口(被適配者)
*/
public interface Turkey {
/**
* 咯咯叫
*/
public void gobble();
/**
* 飛行
*/
public void fly();
}
(2)創建具體的火雞
/**
* 野火雞
*/
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}
(3)創建鴨子接口
/**
* 鴨子接口(目標接口)
*/
public interface Duck {
/**
* 呱呱叫
*/
public void quark();
/**
* 飛行
*/
public void fly();
}
(4)創建火雞適配器,並實現鴨子接口
/**
* 火雞適配器
*/
public class TurkeyAdapter implements Duck {
/**
* 火雞
*/
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quark() {
turkey.gobble();
}
@Override
public void fly() {
// 火雞飛行距離比鴨子短,因此需要調用5次火雞的fly()方法。
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
(5)使用火雞適配器,將火雞適配成鴨子
public class Test {
public static void main(String[] args) {
// 火雞(被適配者)
Turkey turkey = new WildTurkey();
// 火雞適配器
TurkeyAdapter turkeyAdapter = new TurkeyAdapter(turkey);
turkeyAdapter.quark();
turkeyAdapter.fly();
}
}