设计模式-适配器

  1. 意图
  2. 例子
  3. 适用性
  4. 结构
  5. 协作
  6. 效果

意图

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

例子

适配器,想到手机充电适配器。
为了方便自己的苹果手机和安卓手机能共享一根线,常常会买自带转接头的线,这样就可以不需要第二根线了。

首先准备充点接口协议,需要那种先,就需要实现那种协议,这和我们平常充电一样。

public interface IphoneLine {
// 充电
public void charging(int a, int b);
}

public interface AndroidLine {
// 充电
public void charging(int a, int b, int c);
}

建立苹果手机,他需要使用苹果线才行

public class Iphone implements IphoneLine {

@Override
public void charging(int a, int b) {
System.out.pringln("iphone:" + a + "-" + b);
}
}

但是我们现在没有苹果充电线,只有安卓充电线。
生活中我们回去找找有没有转接头,能够转一下。
public class Adapter implements AndroidLine {
IphoneLine iphoneLine;

@Override
public void charging(int a, int b, int c) {
System.out.pringln("iphone:" + a + "-" + b + "-" + c);
iphoneLine.charging(a, b);
}

}

上面代码将适配器实现了安卓线,然后将苹果线组装到该适配器中,这是对象适配器的方式,他依赖于对象组合。

而与他对应的类适配器则使用多重继承对一个接口与另一个接口进行匹配。

public DeviceAdapter extends Iphone implements AndroidLine {

@Override
public void charging(int a, int b, int c) {
System.out.pringln("iphone:" + a + "-" + b + "-" + c);
super.charging(a, b);
}
}

适用性

  1. 想使用一个已经存在的类,而他的接口不符合你的需求。
  2. 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同(即那些接口可能不一定兼容的类)工作。
  3. (仅适用于对象Adapter)想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配他的父类接口。

结构

github

协作

Client在 Adapter实例上调用一些操作。接着适配器调用 Adaptee 的操作实现这个请求。

效果

类适配器和对象适配器有不同的权衡。类适配器

  1. 用一个具体的 Adapter类对Adaptee 和 Target 进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类 Adapter 将不能胜任工作。
  2. 使得 Adapter 可以重定义 Adaptee 的部分行为,因为 Adapter 是 Adaptee 的一个子类。
  3. 仅仅引入了一个对象,并不需要额外的指针以间接得到 Adaptee 。

对象适配器则

  1. 允许一个 Adapter 与多个 Adaptee — 即 Adaptee 本身以及它的所有子类(如果有子类的话)—同时工作。 Adapter 也可以一次给所有的 Adaptee添加功能。
  2. 使得重定义 Adaptee 的行为比较困难。这就需要生成 Adaptee的子类并且使得 Adapter 引用这个子类而不是引用 Adaptee 本身。

使用 Adapter 模式时需要考虑的其他一些因素有:

  1. Adapter的匹配程度
    对 Adaptee 的接口与 Target 的接口进行匹配的工作量各个 Adapter 可能不一样。工作范围可能是,从简单的接口转换(例如改变操作名)到支持完全不同的操作集 合。 Adapter 的工作量取决于 Target 接口与 Adaptee 接口的相似程度。

  2. 可插入的Adapter
    当其他的类使用一个类时,如果所需的假定条件越少,这个类就更具可复用性。如果将接口匹配构建为一个类,就不需要假定对其他的类可见的是一个相同的接口。也就是说,接口匹配使得我们可以将自己的类加入到一些现有的系统中去,而这些系统对这个类的接口可能会有所不同。

  3. 使用双向适配器提供透明操作
    使用适配器的一个潜在问题是,它们不对所有的客户都透明。被适配的对象不再兼容Adaptee的接口,因此并不是所有Adaptee对象可以被使用的地方它都可以被使用。双向适配器提供了这样的透明性。在两个不同的客户需要用不同的方式查看同一个对象时,双向适配器尤其有用。