结构型-适配器模式 Link to heading

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。

其中主要有三个角色

  • 目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口。

  • 源角色:你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。

  • 适配器角色:通过继承或是类关联的方式把源角色转换为目标角色。

场景模拟 Link to heading

中国的充电器无法在英国使用,需要使用适配器。

类适配器 Link to heading

适配器通过类来实现,以类来继承和实现接口的方式,来获取被适配类的信息并转换输出重写到适配接口。

public class ChineseStandard{
  public String getChineseStandard(){
    return "中式插座";
  }
}

public class interfaceBritishStandard{
  String getBritishStandard();
}

public StandardAdapter extends ChineseStandard implements interfaceBritishStandard{
  @Override
  public String getBritishStandard(){
    return this.getChineseStandard();
  }
}

对象适配器 Link to heading

通过实例对象(构造器传递)来实现适配器,而不是再用继承,其余基本同类适配器。

public StandardAdapter implements interfaceBritishStandard{
  private ChineseStandard chineseStandard = new ChineseStandard();
  
  @Override
  public String getBritishStandard(){
    return chineseStandard.getChineseStandard();
  }
}

接口适配器 Link to heading

当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。

public interface BritishStandard{
    String getBritishStandard();
    String getTypeC();
    String getUSB();
}

public abstract class StandardAdapter extends ChineseStandard implements BritishStandard{
  @Override
    public String getBritishStandard() {
        return null;
    }

    @Override
    public String getTypeC() {
        return null;
    }

    @Override
    public String getUSB() {
        return null;
    }
}



// use
StandardAdapter standardAdapter= new StandardAdapter() {
            @Override
            public String getBritishStandard() {
                return new ChineseStandard().getChineseStandard();
            }
        };