Java设计模式——适配器模式

适配器模式也是Java中比较常见的一种模式,我们在开发中经常遇到各个系统之间的对接问题,每个系统的数据模型大多都有差异,直接对接可能会导致不能正常工作,要是修改原先的数据模型又可能会影响之前的系统功能,这时候就需要用到适配器模式。适配器模式说白了就是一个类似于转接头的功能,能够连接两个或多个不兼容的接口可以一起正常工作,又不影响连接的接口的原先功能。

适配器模式的角色:

Source————待适配的类,需要能让该类能接入其他原先不兼容的接口

Target————目标接口

Adapter————适配器,将Source的功能扩展到Target中,实现接口的兼容

使用案例:

     就以手机的数据插头为例子,之前的手机数据头大多都是Mini USB类型的,然而这次加入了type-c,需要用到适配器模式来对该Source类进行适配,适配后的类能兼容多种类型 

  • Source类
//需要适配的类
public class Source{
    public String usb(){
        return "Mini USB";
    }
}
  •  Target接口
//目标接口,新增能支持typeC
interface Target{
    public String typeC();
}

适配器有三种模式可以实现:类似配器、对象适配器、接口适配器

类适配器:类适配器主要是通过继承待适配类Source的方式实现兼容

对象适配器:对象适配器跟类适配器结构差不多,就是写法上的不同,不是通过继承Source类而是要传入待适配类Source的对象来实现兼容

接口适配器:接口适配器在不希望实现一个接口中给所有方法的时候会用到,可以用抽象类实现所有方法,在使用时继承该抽象类按照需求实现对应方法即可。

类适配器模式——ClassAdapter

public class ClassAdapter extends Source implements Target{

    @Override
    public String typeC() {
        String type = usb();
        System.out.println("经过部分处理步骤,将原先的Mini USB接口转换成type-c返回");
        return "type-c";
    }
}
public class AdapterTestClass {
    public static void main(String[] args) {
        Target t = new ClassAdapter();
        System.out.println(t.typeC());
    }

}

对象适配器模式——ObjectAdapter

public class ObjectAdapter implements Target {
    private Source source;

    ObjectAdapter(Source source){
        this.source = source;
    }
    
    @Override
    public String typeC() {
        String type = this.source.usb();
        System.out.println("经过部分处理步骤,将原先的Mini USB接口转换成type-c返回");
        return "type-c";
    }
}
public class AdapterTestObject {
    public static void main(String[] args) {
        Source source = new Source();
        Target t = new ObjectAdapter(source);
        System.out.println(t.typeC());
    }

}

接口适配器模式

 接口适配器跟上面的两种结构上还是有点区别的,主要又进行了一层抽象化

  • 定义公共接口——Sourceable
//公共类型接口
public interface Sourceable{
    public String usb(); //usb类型
    public String typeC(); //type-c类型
}
  • 定义抽象类——AbstractAdapter
//定义了Sourceable的抽象实现类,对Sourceable进行重写,但不做具体实现
public abstract class AbstractAdapter implements Sourceable {
    @Override
    public void usb() {
    }

    @Override
    public void typeC() {
    }
}
  • 再按照需求再实现适配的方法
//这个类专门给type-c做适配
public class TypeCSource extends AbstractAdapter{
    @Override
    public void typeC() {
        System.out.println("这个支持type-c。。。");
    }
}

//这个类专门给Mini USB做适配
public class USBSource extends AbstractAdapter{
    @Override
    public void usb() {
        System.out.println("这个支持Mini USB。。。");
    }
}
  • 运行
public class AdapterTestObject {
    public static void main(String[] args) {
        Sourceable typeCSource = new TypeCSource();
        Sourceable usbSource = new USBSource();
        typeCSource.typeC();
        usbSource.usb();
    }

}

使用场景:

  1. 使用现有类,但是该类中的接口与其他代码不兼容时,可以使用适配器模式
  2. 使用现有子类,但是现有子类缺少一些不能添加到父类的公共功能时,可以使用适配器模式

你可能感兴趣的:(java,设计模式,编程语言)