01 定義
適配器模式:將一個(gè)類(lèi)的接口,轉(zhuǎn)換成客戶期望的另一個(gè)接口。適配器讓原本接口不兼容的類(lèi)可以合作無(wú)間。
02 情景
現(xiàn)在很多電腦只有HDMI接口,想要擴(kuò)展的顯示器是VGA接口,這個(gè)時(shí)候我們需要一個(gè)HDMI轉(zhuǎn)VGA的轉(zhuǎn)接線。這個(gè)轉(zhuǎn)接線就是一個(gè)適配器。
03 類(lèi)圖

AdapterPattern.png
04 Class
// 鴨子接口:目標(biāo)接口,客戶期待的接口。目標(biāo)可以是具體的或抽象的類(lèi),也可以是接口。
public interface Duck {
public void quack();
public void fly();
}
// 小黃鴨:具體目標(biāo)
public class YellowDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
// 火雞接口:Adaptee 需要適配的類(lèi)的接口
public interface Turkey {
public void gobble();
public void fly();
}
// 野生火雞:Adaptee 具體的被適配者
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");
}
}
// 火雞適配器:適配器(Adapter):通過(guò)包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口。
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
05 測(cè)試
YellowDuck yellowDuck = new YellowDuck();
WildTurkey wildTurkey = new WildTurkey();
TurkeyAdapter turkeyAdapter = new TurkeyAdapter(wildTurkey);
System.out.println("The Turkey say...");
wildTurkey.gobble();
wildTurkey.fly();
System.out.println("\nThe YellowDuck say...");
yellowDuck.quack();
yellowDuck.fly();
System.out.println("\nThe TurkeyAdapter say...");
// 這里我們調(diào)用的目標(biāo)接口的方法,而適配器內(nèi)部卻是調(diào)用的被適配者的方法。
turkeyAdapter.quack();
turkeyAdapter.fly();

TestResult.png