意图:
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性:
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
举例,以家中的插头为例,常见的就是三孔与双孔两种插口,以插口为接口,命名
TriplePin:
public interface TriplePin {
//参数分别为火线live,零线null,地线earth,三孔
public void electrify(int l, int n, int e);
}
public interface DualPin {
//这里没有地线,双孔
public void electrify(int l, int n);
}
假设此时有一个电视机需要通电,但他插成了两孔的,插错了,如下:
public class TV implements DualPin {
@Override//既然是两项插头,当然实现两项插标准
public void electrify(int l, int n) {
System.out.println("火线通电:" + l);
System.out.println("零线通电:" + n);
}
}
这时候就需要Adapter来解决他们之间的矛盾,对象适配器如下:
public class Adapter implements TriplePin {
//意味着这个适配器内部是有一个双插接口的
private DualPin dualPinDevice;
//创建适配器地时候,需要把双插设备接入进来
public Adapter(DualPin dualPinDevice) {
this.dualPinDevice = dualPinDevice;
}
//适配器实现的是目标接口
@Override
//实现的是三插标准
public void electrify(int l, int n, int e) {
//实际上调用了被适配设备的双插通电,地线e被丢弃了,当然如果e是别的什么有用的则就需要改动下方的逻辑了
dualPinDevice.electrify(l, n);
}
}
类适配器则不需要将两孔插头接入适配器中了,可以直接通过super调用上述的两孔接口,如下:
public class ClassAdapter extends TV implements TriplePin{
@Override
public void electrify(int l, int n, int e) {
super.electrify(l, n);
}
}
但缺点很明显,这个适配器只适合电视了或者和电视一样的三孔电器才能使用,单孔的则有需要新开一个适配器了,这个还要到具体场景具体业务而定使用对象又或者是类适配器了