Java设计模式之适配器模式

145 阅读2分钟

参考资料 - 掘金:漫话:如何给女朋友解释什么是适配器模式?

适配器可以将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

示例场景:

计算机可以识别U盘,但是无法识别SD卡,
为了让计算机能够识别SD卡,我们需要有一个读卡器,将SD卡插入读卡器后,计算机识别读卡器,从而实现读取SD卡的目的。

那么在这个场景里,读卡器就是计算机和SD卡之间的适配器。

代码示例:

package com.cc.adapter;
​
/**
 * 计算机接口,读取USB设备
 * @author cc
 * @date 21-12-20 23:02
 */
public interface Computer {
    void readUSB();
}
package com.cc.adapter;
​
/**
 * 读卡器
 * @author cc
 * @date 21-12-20 23:09
 */
public class SDReader {
    void readSDCard() {
        System.out.println("读取SD卡的内容");
    }
}
package com.cc.adapter;
​
/**
 * SD卡实体类
 * @author cc
 * @date 21-12-20 23:12
 */
public class SDCard {
    private String  content;
​
    public SDCard(String content) {
        this.content = content;
    }
​
    public String getContent() {
        return content;
    }
​
    public void setContent(String content) {
        this.content = content;
    }
}

这个时候,计算机Computer是无法识别SDCard的,所以我们创建一个适配器(读卡器):

package com.cc.adapter;
​
/**
 * 读取SD卡的适配器
 * @author cc
 * @date 21-12-20 23:09
 */
public class SDCardApapter implements Computer{
    private SDReader sdReader;
​
    public SDCardApapter(SDReader sdReader) {
        this.sdReader = sdReader;
    }
​
    @Override
    public void readUSB() {
        sdReader.readSDCard();
    }
}

测试一下:

package com.cc.adapter;
​
public class Main {
    public static void main(String[] args) {
        // SD卡实例
        SDCard sdCard = new SDCard("这里是SD卡的内容");
        // 读卡器
        SDReader sdReader = new SDReader(sdCard); 
​
        // 计算机通过读卡器这个适配器读取到SD卡里的内容
        Computer computer = new SDCardApapter(sdReader); 
        computer.readUSB();
    }
}

结果:

这里是SD卡内容

示例代码很好的演示了适配器的作用:作为计算机和SD卡之间沟通的桥梁。

适配器的优缺点

优点:

  • 可以复用已有的类和代码:只需要一个桥梁,不需要修改两边的代码
  • 目标类(示例中的计算机)和适配者类(SD卡)解耦
  • 符合开闭原则,可以很方便的更换适配器,不需要修改原有代码

缺点:

  • 过多的使用适配器会让系统变得混乱,比如调用的是A的接口,实际上内部被适配成了调用B接口,系统内如果有太多这种情况,倒不如直接重构系统。

\