1.将一个类的接口转成客户期望的另外一个接口。适配器模式使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。
适配器分为:类适配器、对象适配器、接口适配器
2.类适配器:
2.1定义一个otg充电接口
public interface IOTG {
void powerOTG();
}
2.2定义一个具体类实现这个功能
public class OTG implements IOTG {
@Override
public void powerOTG() {
System.out.println("使用OTG接口充电");
}
}
2.3上面两步已经实现了otg充电的功能;假如现在想增加使用typeC接口充电怎么办?定义一个type充电接口
public interface ITypeC {
void powerTypeC();
}
2.4我们当然可以使用上面的类使用多实现的方式,去实现这个接口;但工作中类功能是相当多的,这样做就不合适了。所以,我们定义一个适配器类。是的它即拥有原来的otg充电功能又有typeC的充电功能,怎么做呢?
public class MultPower extends OTG implements ITypeC {
@Override
public void powerTypeC() {
System.out.println("使用TypeC接口充电");
}
public void power(){
powerOTG();
powerTypeC();
}
}
这样就可以了,继承自OTG类就拥有了otg充电功能,实现typeC接口,也就拥有了typeC充电功能。
2.5看一下测试类
public static void main(String[] args) {
MultPower multPower = new MultPower();
multPower.power();
}
这就是类适配器;继承自原来的具体功能实现类,从而保留了原来的功能;实现新功能的接口,也拥有了新功能;
3.对象适配器:
3.1我们把上面的类MultPower稍加修改,改成MultPower2:
public class MultPower2 implements ITypeC {
private IOTG otg;
public MultPower2(IOTG otg) {
this.otg = otg;
}
@Override
public void powerTypeC() {
System.out.println("使用TypeC接口充电");
}
public void power(){
otg.powerOTG();
powerTypeC();
}
}
它把OTG类作为一个成员变量通过构造引用进来;所以这个类就持有了OTG的对象,通过对象就可以调用otg功能了;因为内部使用的是一个对象,所以又称为对象适配器;
测试类test:
public static void main(String[] args) {
IOTG otg = new OTG();
MultPower2 multPower2 = new MultPower2(otg);
multPower2.power();
}
在构造方法中把对象传进去即可;
这两种适配器其实差不多,使用场景也是一样的:
(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
(2)有一个类,想将其设计为可重用的类(可被多处访问),可以创建适配器来将这个类来适配其他没有提供合适接口的类。
4.接口适配器:
4.1它和前面两种适配器就有很大区别了;首先定义一个接口:
public interface IPower {
void powerTypeC();
void powerOTG();
void power1();
void power2();
void power3();
}
看到这个接口有很多很多功能,但我们只需要其中的两个方法;假如写一个类去实现的话,需要重写每一个方法;即使是空实现也会使代码变得臃肿;
4.2定义一个抽象类来实现此接口;并且重写每一个方法;但都是空实现:
public abstract class Power implements IPower {
@Override
public void powerTypeC() {
}
@Override
public void powerOTG() {
}
@Override
public void power1() {
}
@Override
public void power2() {
}
@Override
public void power3() {
}
}
4.3定义我们自己的类,继承自这个抽象类,并且只写我们自己需要的那两个方法即可:
public class MultPowerAdapter extends Power {
@Override
public void powerOTG() {
System.out.println("使用OTG接口充电");
}
@Override
public void powerTypeC() {
System.out.println("使用TypeC接口充电");
}
public void power(){
powerOTG();
powerTypeC();
}
}
可以看到,我们自己的类多么清爽;这个就是一个适配器类了;同样如果需要其它的方法了,可以定义其它的适配器类分别实现自己想要的方法。
4.4调用:
public static void main(String[] args) {
MultPowerAdapter adapter = new MultPowerAdapter();
adapter.power();
}
调用起来也很轻松;
接口适配器的使用场景:想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。