乐趣区

设计模式8-适配器模式

适配器模式的英文翻译是 Adapter Design Pattern。
顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口 ,让本来因为接口不兼容而不能一起工作的类能够一起工作。
对于这个模式,有一个常常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得能够一起工作。

适配器模式有两种实现形式:类适配器和对象适配器。
其中,类适配器应用继承关系来实现,对象适配器应用组合关系来实现。具体的代码实现如下所示。


// 类适配器: 基于继承
public interface ITarget {void f1();
  void f2();
  void fc();}

public class Adaptee {public void fa() {//...}
  public void fb() { //...}
  public void fc() { //...}
}

public class Adaptor extends Adaptee implements ITarget {public void f1() {super.fa();
  }
  
  public void f2() {//... 从新实现 f2()...
  }
  
  // 这里 fc()不须要实现,间接继承自 Adaptee,这是跟对象适配器最大的不同点}

**// ** 对象适配器:基于组合 **
public interface ITarget {void f1();
  void f2();
  void fc();}

public class Adaptee {public void fa() {//...}
  public void fb() { //...}
  public void fc() { //...}
}

public class Adaptor implements ITarget {
  private Adaptee adaptee;
  
  public Adaptor(Adaptee adaptee) {this.adaptee = adaptee;}
  
  public void f1() {adaptee.fa(); // 委托给 Adaptee
  }
  
  public void f2() {//... 从新实现 f2()...
  }
  
  public void fc() {adaptee.fc();
  }
}

适配器模式利用场景总结

一般来说,适配器模式能够看作一种“弥补模式”,用来补救设计上的缺点。利用这种模式算是“无奈之举”。如果在设计初期,咱们就能协调躲避接口不兼容的问题,那这种模式就没有利用的机会了。

举例:封装有缺点的接口设计

假如咱们依赖的内部零碎在 接口设计方面有缺点 (比方蕴含大量静态方法),引入之后会影响到咱们本身代码的可测试性。为了隔离设计上的缺点,咱们心愿 对外部零碎提供的接口进行二次封装 形象出更好的接口设计,这个时候就能够应用适配器模式了。


public class CD { // 这个类来自内部 sdk,咱们无权批改它的代码
  //...
  public static void staticFunction1() { //...}
  
  public void uglyNamingFunction2() { //...}

  public void tooManyParamsFunction3(int paramA, int paramB, ...) {//...}
  
  public void lowPerformanceFunction4() { //...}
}

// 应用适配器模式进行重构
public class ITarget {void function1();
  void function2();
  void fucntion3(ParamsWrapperDefinition paramsWrapper);
  void function4();
  //...
}
// 留神:适配器类的命名不肯定非得开端带 Adaptor
public class CDAdaptor extends CD implements ITarget {
  //...
  public void function1() {super.staticFunction1();
  }
  
  public void function2() {super.uglyNamingFucntion2();
  }
  
  public void function3(ParamsWrapperDefinition paramsWrapper) {super.tooManyParamsFunction3(paramsWrapper.getParamA(), ...);
  }
  
  public void function4() {//...reimplement it...}
}

代理、桥接、装璜器、适配器 4 种设计模式的区别

代理、桥接、装璜器、适配器,这 4 种模式是比拟罕用的结构型设计模式。它们的代码构造十分类似。抽象来说,它们都能够称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。只管代码构造类似,但这 4 种设计模式的用意齐全不同,也就是说要解决的问题、利用场景不同,这也是它们的次要区别。

代理模式:

代理模式在不扭转原始类接口的条件下,为原始类定义一个代理类,次要目标是管制拜访,而非增强性能,这是它跟装璜器模式最大的不同。

桥接模式:

桥接模式的目标是将接口局部和实现局部拆散,从而让它们能够较为容易、也绝对独立地加以扭转。

装璜器模式:

装璜者模式在不扭转原始类接口的状况下,对原始类性能进行加强,并且反对多个装璜器的嵌套应用。

适配器模式:适配器模式是一种预先的补救策略。

这个模式自身是为了防止继承构造爆炸而设计的;
适配器提供跟原始类不同的接口,而代理模式、装璜器模式提供的都是跟原始类雷同的接口。

退出移动版