適配器模式:不要你覺得,我要我覺得

趙高欲為亂, 恐群臣不聽, 乃先設驗, 持鹿獻於二世日: “馬也。”二世笑曰: “丞相誤耶? 謂鹿為馬。”問左右, 左右或默, 或言馬以阿順趙高, 或言鹿者. 高因陰中諸言鹿者以法。


這就是很有名的指鹿為馬的故事了。今天就藉此典故與大家聊聊適配器模式(Adapter Pattern)


目的

將現有的代碼能力適配到新的接口。


適配器模式:不要你覺得,我要我覺得


例子代碼

從“指鹿為馬”的故事中,我們可以看到趙高需要的是個馬, 但實際上是個鹿, 我們怎麼通過適配器模式來實現他的“指鹿為馬”呢?


適配器模式:不要你覺得,我要我覺得


我們先定義一下鹿和馬的接口:


馬:

<code>public interface Horse extends Target {

void eat();

void run();

void sleep();
}
/<code>

鹿:

<code>public interface Deer extends Adaptee {

void eat();

void walk();

void sleep();
}
/<code>

其中 Target 和 Adaptee 是標記形接口, 無實際意義

本來這二個接口其實沒什麼關聯, 但是現在的情況是我們有個鹿, 但是要給皇帝一匹馬, 先看看我們這條鹿:

<code>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("睡覺");
}
}
/<code>

我們將這個鹿變成馬:

<code>@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();
}
}
/<code>

使用的時候就是這樣:

<code>Horse horse = new HourseAdapter(new MyDeer());
horse.eat();
horse.run();
horse.sleep();
/<code>

輸出結果:

<code>吃草
走路, 遇到緊急情況衝刺
睡覺
/<code>

類圖:


適配器模式:不要你覺得,我要我覺得


一般微服務結構下或者依賴第三方接口或者 jar 包的時候, 可以考慮使用適配器模式對代碼進行兼容和模型防腐


分享到:


相關文章: