适配器模式的目的是将一个接口转换成客户希望的另一个接口。
插座规范因地域不同一样,主要体现在插头的样式上,不同的插头样式适配不同的插座,而接口的不同则则主要体现在实现的方法上,通过原接口来实现目标接口就是适配器模式需要做的事,如何通过原接口实现目标接口就是我们实现适配器模式最需要考虑的事情。
这里用一个例子来说明:第一章中我们实现了很多不同行为的鸭子类,假如这时候有一只火鸡混入了鸭子群,我们如何让它假冒成鸭子骗过公路上的例行检查呢?这时候就可以使用适配器模式将火鸡变成伪装成一只鸭子!
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("Duck fly");
}
}
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("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();
}
}
}
这里Duck接口有两个方法需要实现,一个是quack一个是fly,而适配器的实现思路是通过火鸡子接口中的fly和gobble方法进行实现,在其他需求中使用适配器模式也会是相同的方式,这时候就需要具体问题具体分析了。
适配器模式有两种,一种是对象适配器,一种是类适配器。上面是对象适配器的典型例子,它的类图如下:

通过对象组合实现目标接口,这样的好处是任何实现对象接口的子类都能适用,这样就将适配器从原接口和目的接口的代码中解耦出来了。
而类适配器的类图如下:

类适配器是通过继承的方式实现了目标接口,但因为类适配器需要多继承特性,所有在不支持多继承的语言中(例如java)并不是那么常用。
发表回复