什么是适配器模式?
生活中常见的适配器是电源适配器,比如手机的充电器,就是个电源适配器,把220V的电压转为5V的电压,提供给手机充电。
所谓适配器,就是连接在两个不匹配的东西之间,使之匹配的一个中间件。
因此适配器模式就是这样一个模式,可以将不匹配的接口转化为可以匹配的接口,使原本因不兼容而无法一起工作的接口与类可以一起工作。
类适配器
类适配器的适用场景:
客户端要使用的接口没有对应的方法,但是这个方法能在其他接口或者类中找到,但是又不想修改原来的接口,也不希望或者不能直接使用另一个类,这种场景就需要用到适配器,通常的做法是 定义一个适配器,实现客户端要用的接口,继承有目标功能的类,在对应的接口的实现中调用目标功能达到功能的适配。
220V接口
public interface _220V{
void out220V();
}
5V接口
public interface _5V{
void out5V();
}
5V实现类
public class _5V_ implements _5V{
void out5V(){
System.out.print("输出5V电源");
}
}
适配器
public class Adapter extends _5V_ implements _220V{
void out220V(){
out5V();
}
}
如此一来,220V的电源通过适配器可以输出5V的电源,起到了适配的作用。
对象适配器
而对象适配器的使用场景同类适配器是一样的,无非是把继承改为了委托,即在适配器中持有目标方法所在的对象,在适配器的接口方法内调用目标对象的方法,实现适配。
public class Adapter implements _220V{
_5V _5v = new _5V_();
void out220V(){
_5v.out5V();
}
}
接口适配器
接口适配器适用的场景如下:
在一个接口内,定义了很多很多方法,但是如果我需要某一些功能,而不是全部,如果直接实现,那么就意味着需要实现这个接口内所有的方法,即使不使用也必须有置空的方法,显得非常臃肿。
而接口适配器就是 定义一个类(抽象不抽象皆可,一般为抽象),去实现这个接口,并实现接口内所有的方法【可以置空】,然后在通过继承这个类,然后重写需要的方法,这样就不会显得臃肿。
目标接口:
public interface TargetInteferce{
void a();
void b();
void c();
void d();
void e();
void f();
}
适配器:
public abstract class Adapter implements TargetInteferce{
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
public void f(){}
}
目标类:
public class Target extends Adapter{
public void a(){
System.out.println("a");
}
public void b(){
System.out.println("b");
}
}