网站建设 岗位职责 智联,设计师网上接单被骗,青岛 网站建设,wordpress倒计时插件是什么#xff1f; 我们平时的有线耳机接口分为USB的和Type-C的接口#xff0c;但是手机的耳机插口却只有一个#xff0c;像华为的耳机插口现在基本都是Type-c的#xff0c;那如果我们现在只有USB接口的耳机怎么办呢#xff0c;这个时候就需要使用到一个转换器#xff0c…是什么 我们平时的有线耳机接口分为USB的和Type-C的接口但是手机的耳机插口却只有一个像华为的耳机插口现在基本都是Type-c的那如果我们现在只有USB接口的耳机怎么办呢这个时候就需要使用到一个转换器这个转换器是USB接口的插入USB插口中然后它的背面可供Type-C的接口插入最终实现一个转换效果这其实就是使用到了适配器模式 因此适配器模式就是将一个类的接口转换成客户希望的另外一个接口使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器模式分为类适配器模式和对象适配器模式前者类之间的耦合度比后者高且要求程序员了解现有组件库中的相关组件的内部结构所以应用相对较少些
结构
目标接口当前系统业务所期待的接口它可以是抽象类或接口
适配者类它是被访问和适配的现存组件库中的组件接口
适配器类它是一个转换器通过继承或引用适配者的对象把适配者接口转换成目标接口让客户按目标接口的格式访问适配者
实现
类适配器
实现方式定义一个适配器类来实现当前系统的业务接口同时又继承现有组件库中已经存在的组件
目标接口 public interface USB {//目标接口void connectByUsb();
}
public class IUSBImpl implements USB{Overridepublic void connectByUsb() {System.out.println(连接USB接口);}
}
适配者类
//适配器
public class Adapter extends ITypeCImpl implements USB{Overridepublic void connectByUsb() {System.out.println(使用适配器);connectByTypeC();}
}
适配器类
//适配器
public class Adapter extends ITypeCImpl implements USB{Overridepublic void connectByUsb() {System.out.println(使用适配器);connectByTypeC();}
}
使用
public class Phone {public void connectHeadset(USB usb){usb.connectByUsb();}
}
public class Consumer {public static void main(String[] args) {Phone phone new Phone();Adapter adapter new Adapter();IUSBImpl usb new IUSBImpl();phone.connectHeadset(usb);System.out.println();phone.connectHeadset(adapter);}
} 我们可以这样理解我们原来使用USB接口直接连接手机的USB接口而现在我们手里的耳机是TypeC接口因此是不能直接连接手机接口的我们只能连接转换器适配器然后让转换器帮我们转换然后去连接手机的USB接口
缺点
类适配器模式违背了合成复用原则类适配器是客户类有一个接口规范的情况下可用反之则不可用也就是说如果我们的适配器是实现了USB接口规范的但如果它本身没有这个接口规范而只有单单一个类的情况下就没办法使用了继承只能单继承
对象适配器
实现方式对象适配器模式可采用将现有组件库中已经实现的组件引入适配器类中该类同时实现当前系统的业务接口
目标接口
public interface USB {//目标接口或目标对象void connectByUsb();
}
public class IUSBImpl implements USB {Overridepublic void connectByUsb() {System.out.println(连接USB接口);}
}适配者类
public interface TypeC {//适配者void connectByTypeC ();
}
public class ITypeCImpl implements TypeC {Overridepublic void connectByTypeC() {System.out.println(使用Type-C接口连接);}
}
适配器类
//适配器
public class Adapter extends IUSBImpl {//聚合适配者类private TypeC typeC;public Adapter(TypeC typeC) {this.typeC typeC;}Overridepublic void connectByUsb() {System.out.println(适配器连接USB接口);typeC.connectByTypeC();}
}
使用
public class Phone {public void connectHeadset(USB usb){usb.connectByUsb();}
}
public class Consumer {public static void main(String[] args) {Phone phone new Phone();IUSBImpl usb new IUSBImpl();//直接使用USB连接phone.connectHeadset(usb);System.out.println();ITypeCImpl typeC new ITypeCImpl();Adapter adapter new Adapter(typeC);//通过适配器连接phone.connectHeadset(adapter);}
}简单来说我们在适配器中没有直接去继承适配者的实现类而是聚合了适配者类这样的话无论我们的目标对象不管是类还是接口都可以完美实现了且符合合成复用原则
注意还有一个适配器模式是接口适配器模式当不希望实现一个接口中所有方法的时候可以创建一个抽象类Adapter实现所有方法而此时我们只需要继承该抽象类即可比较简单就不再过多赘述
使用场景
1.以前开发的系统存在满足新系统功能需求的类但其接口同新系统的接口不一致
2.使用第三方提供的组件但组件接口定义和自己要求的接口定义不同