适配器模式:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式试用场景:
- 现存接口不满足业务场景,在有可复用类的情况下通过适配器,在调用原有接口,可以使用新接口的实现
- 在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
举个栗子: 香港的充电插头跟国内是有差异的,我们先来看看香港充电插头标准跟实现
//香港插头标准
public interface HKNormInterface {
void threeHoles();
}
//香港插头标准实现
public class HKNormImpl implements HKNormInterface {
@Override
public void threeHoles() {
System.out.println("使用香港标准....");
}
}
//香港酒店使用香港充电标准
public class HKHotel {
private HKNormInterface hkNormInterface;
public void useHKNorm(){
hkNormInterface.threeHoles();
}
public HKNormInterface getHkNormInterface() {
return hkNormInterface;
}
public void setHkNormInterface(HKNormInterface hkNormInterface) {
this.hkNormInterface = hkNormInterface;
}
}
//在酒店使用香港标准
public static void main(String[] args){
HKHotel hkHotel = new HKHotel();
HKNormInterface hkNorm = new HKNormImpl();
hkHotel.setHkNormInterface(hkNorm);
hkHotel.useHKNorm();
}
执行main方法后,会打印使用香港标准,这是没问题的.(main方法自己随便一个类复制过去就能使用)
然后是我们国内的标准
//国内插头标准
public interface CNNormInterface {
void twoHoles();
}
//国内插头标准实现
public class CNNormImpl implements CNNormInterface{
@Override
public void twoHoles() {
System.out.println("使用国内标准");
}
}
那么问题来了,你在香港,带着国内标准的插头,没有香港的标准插头,你是用不了插头来充电的,因为标准(接口)不一样,这时候,你需要一个转接器(适配器)才能使用充电,转接器如下
PS:也可以选择不继承CNNormImpl,通过组合使用CNNormInterface接口也可以的
//适配国内的标准,可以在香港使用国内的充电插头
public class ApaterCNNorm extends CNNormImpl implements HKNormInterface{
@Override
public void threeHoles() {
super.twoHoles();
}
}
然后我们的测试方法就要修改一下了,改成如下:
public static void main(String[] args){
HKHotel hkHotel = new HKHotel();
//HKNormInterface hkNorm = new HKNormImpl();
HKNormInterface hkNorm = new ApaterCNNorm();
hkHotel.setHkNormInterface(hkNorm);
hkHotel.useHKNorm();
}
执行后会打印,使用国内标准,说明使用适配成功了,
上面,我们只创建了一个适配器类,在使用的时候,替换掉了HKNorImpl实现,转换为适配器的实现(ApaterCNNorm),接口不变,只修改了调用方的一行代码,降低了代码的耦合,甚至调用方都不知道,中间有一层适配器,以为还是香港标准,其实内部已经变为国内标准了.
UML图如下,各位同学可以看一下,加深对适配器模式的理解:
适配器(ApaterCNNorm)通过继承CNNormImpl实现HKNormInterface接口来保证类型的统一,表面上调用的还是HKNormImpl的threeHoles方法,实际上使用的是CNNormImpl的twoHoles的实现
PS:笔者觉得,适配器模式更像是静态代理模式的变种....
到这,文章就结束了!
以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流
欢迎转载,请注明出处跟作者,谢谢!