适配器:何为适配器?
搜狗百科:
适配器是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。
那么在Java中适配器是啥呢?
在阎宏博士的《JAVA与模式》一书中开头是这样描述适配器(Adapter)模式的:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
原本所要用的接口没有那个功能,另外一个接口具备但是我们又必须要使用这个接口,这个时候我们需要一个东西来把他们连接起来,就要用到适配器。
分为:类适配器、对象适配器、接口适配器
作用:帮助程序员专注 所实现的功能,使代码简洁。
类适配器:通过继承来实现适配器功能
public class Test2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Ps3 p = new Adapter2();
p.isPs2();
}
}
interface Ps3 {
void isPs2();
}
interface Usb2 {
void isUsb();
}
class Usber2 implements Usb2 {
@Override
public void isUsb() {
System.out.println("USB口");
}
}
class Adapter2 extends Usber2 implements Ps3 {
@Override
public void isPs2() {
isUsb();
}
}
这个例子我们有一个ps3的接口现在我要用这个,但是我现在只有usb2的接口,两个口不对头插不进去,怎么办呢?
弄一个适配器Adapter2 继承usb2的实现类usber2(接口只是一个规范,它需要实现,所以需要弄出一个真正的usb来实现usb2接口的设计) 再来实现接口ps3,这个时候因为Adapter2 继承usb2的实现类usber2而usber2实现了isusb()方法,则我们在Adapter2所需要实现的isps2()中调用isusb方法 即实现了ps3到usb2的转变。
对象适配器:通过创建对象
package com.ps.adapter;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Ps2 p = new Adapter(new Usber());
p.isPs2();
}
}
interface Ps2 {
void isPs2();
}
interface Usb {
void isUsb();
}
class Usber implements Usb {
@Override
public void isUsb() {
System.out.println("USB口");
}
}
class Adapter implements Ps2 {
private Usb usb;
public Adapter(Usb usb){
this.usb = usb;
}
@Override
public void isPs2() {
usb.isUsb();
}
}
对象适配器与类适配器相似只是构建不一样一个通过继承 一个创建相应实例,通过实例调用方法即可。
接口适配器:
interface A {
void a();
void b();
void c();
void d();
void e();
void f();
}
abstract class Adapter implements A {
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
public void f(){}
}
class Ashili extends Adapter {
public void a(){
System.out.println(“实现A方法被调用”);
}
public void d(){
System.out.println(“实现d方法被调用”);
}
}
当一个接口定义了许多方法,而你在使用这个接口的时候如果不用到适配器,会出现所有的方法都需要实现的情况,就非常繁琐与麻烦,这个时候采用适配器,定义一个抽象类的适配器实现目标接口,并实现接口方法,但是需要实现的接口方法我们不去真正意义上的实现,都定义为空方法,这样需要用目标接口的类继承该抽象类适配器,这个时候你需要哪个方法重写即可,有的同学会问为什么我不直接在那个类当中直接将其他不需要的方法写为空方法呢?
这就是我们适配器模式的作用,不需要的方法你写在目标类中,会让该类显得冗余,而且当你使用的时候会出现很多空方法,会让你显得手足无措,有的时候可能让人变得烦闷,这个时候用到适配器帮助程序员专注 所实现的功能,使代码简洁。
对于接口适配器我认为在未来的学习生活中会用到许多,比如监听器中的MouseListener就有相应的MouseAdapter等等。
适配器模式应用场景
类适配器与对象适配器的使用场景一致,仅仅是实现手段稍有区别,二者主要用于如下场景:
(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。
接口适配器使用场景:
(1)想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。