头图

目录

类适配器

下面我们使用Mac电脑和U盘适配的一个简单实例来了解类适配器的实现方式。

首先创建一个Mac的接口有读写的数据的功能

public interface MacInterface {
    void write(String msg);
    String read();
}

然后有一个u盘的实例

public class UDisk {
    public void byWrite(String msg){
        System.out.println(msg);
    }
    public String byRead(){
        return "拜登家谱";
    }
}

但是mac接口直接连接u盘所以我们给它增加一个适配器,通过适配器连接两者。

public class MacUsbAdaptor extends UDisk implements MacInterface{
    @Override
    public void write(String msg) {
        super.byWrite(msg);
    }

    @Override
    public String read() {
        return super.byRead();
    }
}
public class AdaptorTest {
    @Test
    public void test(){
        MacInterface macInterface = new MacUsbAdaptor();
        System.out.println(macInterface.read());
        macInterface.write("川普私密照片");
    }
}
=====结果=====
拜登家谱
川普私密照片

对象适配器

使用和上面相同的实例,通过组合的方式来实现对象适配器。

public interface MacInterface {
    void write(String msg);
    String read();
}
public class UDisk {
    public void byWrite(String msg){
        System.out.println(msg);
    }
    public String byRead(){
        return "拜登家谱";
    }
}
public class MacUsbAdaptor implements MacInterface {
    private UDisk disk;

    public MacUsbAdaptor(UDisk disk) {
        this.disk = disk;
    }

    @Override
    public void write(String msg) {
        //适配过程中肯定涉及到一些 “适配” 的过程,比如说统一格式
        disk.byWrite(msg);
    }

    @Override
    public String read() {
        return disk.byRead();
    }
}
public class AdaptorTest {
    @Test
    public void test(){
        MacInterface macInterface = new MacUsbAdaptor(new UDisk());
        System.out.println(macInterface.read());
        macInterface.write("川普私密照片");
    }
}
=====结果=====
拜登家谱
川普私密照片

两种适配器的选择

  • 被适配的类(如UDisk)的接口(类里面的方法)不多,两者都可以
  • 被适配的类的接口较多而且接口大多数都需要和接口类(如 MacInterface)中的方法适配,那么可以选择类适配器,这样可以复用被适配类中的方法,节省代码量。
  • 被适配的类的接口较多而且其接口和接口类(如 MacInterface)中的方法适配的不多,那么可以选择对象适配器,组合相对于继承更加灵活。

使用场景

  • 原有接口无法修改但又必须快速兼容新接口
  • 不同数据格式、协议之间的转换
  • 需要使用外部组件组合成新组件来提供功能,而又不想重复开发部分功能

eacape
211 声望8 粉丝

JAVA 攻城狮


« 上一篇
代理模式
下一篇 »
桥接模式