适配器(设计模式)

适配器模式之所以存在,和不同手机充电线的接头互不相同是一样的。

比如说,假设现在只有一个带标准USB插口的充电器,怎么样才既能给Android手机充电,又能给iPhone充电呢?答案当然是使用不同的充电线,一条有micro接口,一条有雷电接口。也就是说,我们使用充电线后,虽然仍旧是使用标准USB接口充电,但实际上负责传电的已经变成了micro usb接口和雷电接口,充电线其实就是个另类的适配器。

再举个例子:

假设我们现在有个类son,实现了Eat接口,Eat接口里有EatFood方法,同时还有一个外部类mother(内部聚合了一个son版Eat接口),mother会调用Eat接口的EatFood方法,让son去吃饭。现在mother让son去吃饭时再带上一个女孩一起吃(绝对是亲生的的有木有),但不允许修改son和Eat接口,这时怎么办?(要求是不改变原有接口的同时,还能使用新功能)

这时我们可以创建一个撩妹版son(handSomeSon),他也实现了Eat接口,他在实现EatFood方法时,偷偷地在调用了另一个新接口EatWithGirl的EatFoodWithGril方法,这样一来,mother(内部聚合了一个handSomeSon版Eat接口)还是调用Eat接口的EatFood方法,撩妹版son就和妹子去吃饭去了。也就是说,我们不改变原有接口Eat,却使用到了新接口EatWithGirl的功能

至于适配器模式的优缺点,可以总结如下。

优点

  • 将目标类(mother)与适配者类(EatWithGirl接口)解耦,并不直接连通。
  • 代码灵活性和扩展性都非常好,符合开闭原则。
  • 类适配器模式(handSomeSon继承自实现了EatWithGirl接口的类)有个优点,可以在适配器handSomeSon中修改实现了EatWithGirl接口的类的方法,适配器更加灵活。
  • 对象适配器模式(handSomeSon内部有实现了EatWithGirl接口的类的对象实例)有个优点,可以同时适配实现了EatWithGirl接口的类和该类的子类。

缺点

  • 类适配器模式的缺点正好和对象适配器的优点相反,而对象适配器模式的缺点正好和类适配器的优点相反。
  • 适配器可能会有许多子类(对象适配器)或许多适配器类(类适配器)