现在来到了适配器模式,适配器顾名思义,就是让现有代码通过适配器从而起到另一角色的作用。我们通过代码来了解一下。
案例
鸭子和火鸡,都是会飞会叫的动物,我们先来建立鸭子接口和火鸡接口,并分别建立两个他们的实现类。
public interface Duck {
void quack();
void fly();
}
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("quack");
}
@Override
public void fly() {
System.out.println("fly");
}
}
public interface Turkey {
void gobble();
void fly();
}
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
接下来是重头戏,就是我们的适配器,我们想要让火鸡充当鸭子,那么我们需要让这个类实现鸭子接口的两个方法,我们的目的让火鸡充当鸭子,所以我们就需要传入一个火鸡,把它包装成鸭子。所以需要一个火鸡作为这个适配器的属性。那么这个类的结构就很明了了,一个火鸡属性,实现鸭子接口的两个方法。
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
在 quack() 方法中,调用turkey.gobble() 方法,在 fly() 中调用 turkey.fly() 方法,因为火鸡飞的近,所以就飞5次打到鸭子的飞行距离。
客户使用适配器的过程如下:
- 客户通过目标接口调用适配器的方法对适配器发起请求。
- 适配器使用被适配器接口把请求转换成被适配者的一个或多个调用接口。
- 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
现在我们来看看适配器模式的定义:
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。