案例引入
如果我们要开发一套充电器接口,同时支持安卓的Type-c和苹果的lighting接口,我们可以使用什么设计模式呢?工厂模式,还是抽象工厂模式?但如果我们还有一种需求,让我们的接口可以自动根据充电头的类型进行适配,如果是前两种思想是不行的,因为它无法根据类型进行自动转换。到了这里,我们就不得不提设计模式的中的适配器模式了。
![](https://i-blog.csdnimg.cn/blog_migrate/994fcfbcace0a490cc1a3214195dc530.png)
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器在于适配二字,它不是创建新的类型,而是一种聚合再转接的方法。它对外暴露唯一的接口,客户端调用接口无需知道内部的逻辑,系统接口功能的适配由内部解决。
![](https://i-blog.csdnimg.cn/blog_migrate/06812035180037d08395dde740777647.png)
适配器的优缺点
适配器为外提供了统一的接口,降低了系统的耦合性,增加和修改无需修改客户端代码,但也一定层度增加了适配的难度,服务端复杂性有所增加。
优点
降低了系统的耦合性,增删改适配不同类型的接口无需对暴露接口进行修改
提高类的复用能力,如使用适配器实现多个类的复用组合
缺点
适配器让提升了系统的复杂度,系统功能控制难度有所提升(存在适配器适配A型,却错误适配B型的可能)
案例
需求分析
对于前面的案例,我们拓展一下需求:实现一个接口,外部调用无需考虑适配问题,系统内部需要对客户端传递的参数进行解析,选择出正确的接口,最终实现适配器的功能。
代码
外部接口
客户端调用传递参数,选择正确的适配器
public interface charger {
void charge(String Type);
}
适配器适配方法
此处制定不同适配器的适配实现方法,下面两个类实现接口,实现系统的功能
public interface ChargerAdapter {
void Type_c_charger(String type);
void light_charger(String type);
}
public class TypeCharger implements ChargerAdapter{
@Override
public void Type_c_charger(String type) {
System.out.println(type);
}
@Override
public void light_charger(String type) {
}
}
public class UsbCharger implements ChargerAdapter{
@Override
public void Type_c_charger(String type) {
}
@Override
public void light_charger(String type) {
System.out.println(type);
}
}
在此处不同方法的适配
public class Adapter implements charger{
ChargerAdapter chargerAdapter;
public Adapter(String type){
if(type.equalsIgnoreCase("type")){
chargerAdapter = new TypeCharger();
}else{
chargerAdapter = new UsbCharger();
}
}
@Override
public void charge(String type) {
if(type.equalsIgnoreCase("type")){
chargerAdapter.Type_c_charger(type);
}else{
chargerAdapter.light_charger(type);
}
}
}
客户端调用
public class Application {
public static void main(String[] args) {
AdapterMode adapterMode1=new AdapterMode();
adapterMode1.charge("Type");
AdapterMode adapterMode2=new AdapterMode();
adapterMode2.charge("light");
}
}