适配器模式:不要你觉得,我要我觉得

赵高欲为乱, 恐群臣不听, 乃先设验, 持鹿献于二世日: “马也。”二世笑曰: “丞相误耶? 谓鹿为马。”问左右, 左右或默, 或言马以阿顺赵高, 或言鹿者. 高因阴中诸言鹿者以法。


这就是很有名的指鹿为马的故事了。今天就借此典故与大家聊聊适配器模式(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 包的时候, 可以考虑使用适配器模式对代码进行兼容和模型防腐


分享到:


相關文章: