目的
將現有的代碼能力適配到新的接口
例子代碼
趙高欲爲亂, 恐羣臣不聽, 乃先設驗, 持鹿獻於二世日: “馬也” 二世笑曰: “丞相誤耶? 謂鹿爲馬.” 問左右, 左右或默, 或言馬以阿順趙高, 或言鹿者. 高因陰中諸言鹿者以法
這就是很有名的指鹿爲馬的故事了, 我們可以看到趙高需要的是個馬, 但實際上是個鹿, 我們怎麼通過適配器模式來實現他的指鹿爲馬呢
我們先定義一下鹿和馬的接口:
馬:
public interface Horse extends Target {
void eat();
void run();
void sleep();
}
鹿:
public interface Deer extends Adaptee {
void eat();
void walk();
void sleep();
}
其中 Target 和 Adaptee 是標記形接口, 無實際意義
本來這二個接口其實沒什麼關聯, 但是現在的情況是我們有個鹿, 但是要給皇帝一匹馬, 先看看我們這條鹿:
public class MyDeer implements Deer {
@Override
public void eat() {
System.out.println("喫草");
}
@Override
public void walk() {
System.out.println("走路, 遇到緊急情況衝刺");
}
@Override
public void sleep() {
System.out.println("睡覺");
}
}
我們將這個鹿變成馬:
@Data
@AllArgsConstructor
public class HourseAdapter implements Horse {
private Deer deer;
@Override
public void eat() {
deer.eat();
}
@Override
public void run() {
deer.walk();
}
@Override
public void sleep() {
deer.sleep();
}
}
使用的時候就是這樣:
Horse horse = new HourseAdapter(new MyDeer());
horse.eat();
horse.run();
horse.sleep();
輸出結果:
喫草
走路, 遇到緊急情況衝刺
睡覺
類圖:
類圖地址:
https://mp.weixin.qq.com/s?__biz=MzUzOTQ2MjgwNA==&mid=2247483859&idx=1&sn=ac2223296fdbe551201fff2a8f125fba&chksm=fac95c28cdbed53ee3a2e782b965f54370c1b43bfec47f5435d925ef345f7e70475dbe3f1d41&token=1268878968&lang=zh_CN#rd
一般微服務結構下或者依賴第三方接口或者 jar 包的時候, 可以考慮使用適配器模式對代碼進行兼容和模型防腐