介绍:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
优点:
小明去香港买了个iphone7 puls,拿回大陆的家中,发现港式插头为三孔插头电压为200v,家中插头都为二空的220v电压,用不了(如图)。这个时候,小明只能再去买个转换头了。
需求:香港提供的苹果插头为三孔200v,客户需求适配器的功能是将三孔转成二孔220v。苹果的输出电流是10I。
分析:对于电压转换,可见对应电阻应该为20欧和22欧。对于插孔,前者有火线、零线、地线,而后者只需要火线和零线即可。
角色 | 作用 |
---|---|
原接口 | 需要适配的接口 |
目标接口 | 客户所期待的接口 |
适配器 | 把原接口转换成目标接口 |
原接口–三孔插头 输入电压200v
public class HongkongPlug {
int voltage = 200;
int rs = 20;
// 200v的输出方法
public void twoHundredV() {
System.out.println(voltage / rs);
}
// 三孔插头
public void threeHole() {
neutralWire();
liveWire();
groundWire();
}
public void neutralWire() {
System.out.println("火线");
}
public void liveWire() {
System.out.println("零线");
}
public void groundWire() {
System.out.println("地线");
}
}
目标接口—二孔插头 输入电压220v
public interface MainlandPlug {
// 220v的输出方法
public void twoHundredTwentyV();
// 两孔插头
public void twoHole();
}
类适配器—通过继承原接口
public class ClassAdapter extends HongkongPlug implements MainlandPlug {
@Override
public void twoHundredTwentyV() {
voltage = 220;
rs += 2;
twoHundredV();
}
@Override
public void twoHole() {
neutralWire();
liveWire();
}
}
测试代码
public static void main(String[] args) {
HongkongPlug hk=new HongkongPlug();
hk.threeHole();
hk.twoHundredV();
System.out.println("=========回到大陆");
ClassAdapter ad =new ClassAdapter();
ad.twoHole();
ad.twoHundredTwentyV();
}
输出如下
火线
零线
地线
10
=========回到大陆 火线
零线
10
成功实现目标业务
区别:类适配器通过继承原接口的方式实现适配,而对象适配器通过持有原接口对象的方式实现适配。
public class ObjectAdapter implements MainlandPlug {
private HongkongPlug hkp;
public ObjectAdapter(HongkongPlug hkp) {
this.hkp = hkp;
}
@Override
public void twoHundredTwentyV() {
hkp.voltage = 220;
hkp.rs += 2;
hkp.twoHundredV();
}
@Override
public void twoHole() {
hkp.neutralWire();
hkp.liveWire();
}
}
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54