Java 23种设计模式之 - 适配器模式

适配器模式分为三种:类的适配器、对象的适配器、接口的适配器。

简单的理解适配,就是把两个不相匹配的东西变的匹配。下面以手机使用普通u盘为例,一般情况下,手机需要使用u盘时,由于接口的不吻合,需要使用到OTG线进行接口转换。

1、类的适配器

usb接口

public interface Usb {
    void usbPort();
}

OTG类

public class OTG {
    public void OtgLine(){
        System.out.println("已连接上OTG线,可接U盘");
    }
}

适配器类(Adapter)

public class Adapter extends OTG implements Usb {
    @Override
    public void usbPort() {
        OtgLine();   //连接OTG,转换接口
    }
}

测试类

public class AdapterTest {
    public static void main(String args[]){
       Usb mUsb = new Adapter();
       mUsb.usbPort();
    }
}

输出:
Java 23种设计模式之 - 适配器模式_第1张图片

2、对象的适配器 ,在上面的代码中,仅修改Adapter类即可,如下:

public class Adapter implements Usb {
    private OTG mOTG;

    public Adapter(OTG otg){
        this.mOTG = otg;
    }

    @Override
    public void usbPort() {
        mOTG.OtgLine();
    }
}

//测试代码为
public class AdapterTest {
    public static void main(String args[]){
        OTG otg = new OTG();
       Usb mUsb = new Adapter(otg);
       mUsb.usbPort();
    }
}

3、接口的适配器,通过定义一个抽象类实现接口的空方法。然后定义一个具体类继承该抽象类,重写自己需要使用的方法。比如,假设一台手机有三个接口,分别是usb,耳机和电源,在某一时刻,只想听歌,那么可以这样写:

手机接口类(IPhone)

public interface IPhone {
    void usb();
    void audio();
    void power();
}

实现了IPhone的抽象类Phone

public abstract class Phone implements IPhone {
    @Override
    public void usb() { }
    @Override
    public void audio() { }
    @Override
    public void power() { }
}

具体类 User

public class User extends Phone {
    @Override
    public void audio() {
        super.audio();
        System.out.println("只想听歌");
    }
}

应用场景:当系统需要使用现有类,但是类的接口不符合系统的需要时,可以通过适配器模式进行接口的转换。优点:在于更好的复用性和扩展性,但是,不管使用什么东西,讲究的是一个合理性。因此,过多的使用适配器模式,会让自己的代码变得不好掌控。

你可能感兴趣的:(设计模式)