1、适配器模式(Adapter)的定义
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
- 适配器模式包括3种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。
- 用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。
2、模式(Adapter)优缺点
适配器模式是一种结构型设计模式。其主要优缺点如下:
优点:
- 更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
- 更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
缺点:
- 会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
3、模式(Adapter)适用环境
类适配器与对象适配器的使用场景一致 ,仅仅是实现手段稍有区别,二者主要用于如下场景:
- 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
- 我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。
接口适配器使用场景:
- 想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。
4、模式(Adapter)的结构
如图所示,Client不能直接访问Adaptee。Adapter是适配器,它将Adaptee转换成Client能访问的接口。所以通过适配器Adapter,用户端就可以访问Adaptee。
适配器模式涉及3个角色:
- 源(Adaptee):需要被适配的对象或类型,相当于插头。
- 适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。
- 目标(Target):期待得到的目标,相当于插座。
- 适配器模式包括3种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。
对象适配器模式是另外6种结构型设计模式的起源。
5、模式(Adapter)的应用实例
5.1 类适配器
1)有个传统的Micro USB的充电线
/**
* 有个传统的Micro USB的充电线
*
*/
public interface MicroUSB {
void isMicroUSB();
}
2)手机充电口为typec
/**
* 手机充电口为typec
*
*/
public interface TypeC {
void isTypeC();
}
public class TypeCImpl implements TypeC{
@Override
public void isTypeC() {
System.out.println("typec充电口");
}
}
3)整个适配器adapter,将MicroUSB 转化成typec
/**
* 用于将MicroUSB接口转化成tytpec接口
*
*/
public class Adapter extends TypeCImpl implements MicroUSB{
@Override
public void isMicroUSB() {
isTypeC();
}
}
4)client
public class Client {
public static void main(String[] args) {
MicroUSB microUSB = new Adapter();
microUSB.isMicroUSB();
}
}
5.2 对象适配器
1)TypeC接口、MicroUSB接口以及实现同上
2)适配器类
public class Adapter implements MicroUSB{
private TypeC typeC;
public Adapter(TypeC typeC){
this.typeC = typeC;
}
@Override
public void isMicroUSB() {
typeC.isTypeC();
}
}
3)client
public class Client {
public static void main(String[] args) {
TypeC typeC = new TypeCImpl();
MicroUSB microUSB = new Adapter(typeC);
microUSB.isMicroUSB();
}
}
5.3 接口适配器
接口的适配器,很简单,假如有个很大的接口,几十个方法,但是并不是每个实现该接口的都必须得实现所有方法,此时,就可以做个抽象的中间类,实现大部分接口,方法实现都是空。之后开发都继承这个抽象类,用哪些方法,就覆写哪些方法。
评论区