设计模式-结构型模式-适配器模式

1.适配器模式定义

将类的接口转化为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作;

1.1 适配器模式的优缺点

优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构;
  • 增加了类的透明性和复用性,将具体业务实现过程封装在适配者类中,对于客户端而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用;
  • 灵活性和扩展性都很好,通过使用配置文件可以很方便的更换适配器,也可以在不修改原有代码的基础上增加增加适配器类,符合开闭原则;

缺点

1. 类适配器的缺点
  • 对于Java不支持多重继承的语言来说一次最多只能适配一个适配者类,不能同时适配多个适配者类;
  • 适配者类不能为最终类
2.对象适配器的缺点
  • 与类适配器模式相比,在该模式下要在适配器中置换适配器类的某些方法比较麻烦;

1.2 适配器模式适用的场景

  • 统一多个类的接口
  • 需要依赖外部系统时,当把项目依赖的一个外部系统替换为另一个外部系统时,利用适配器模式可以减少对代码的改动;
  • 原有接口无法修改或者原有接口功能太老旧但又要兼容;
  • 适配不同数据格式时;

2.适配器模式的原理

  • 目标接口(Target):当前系统业务所期待的接口,它可以是抽象类或接口;
  • 适配者类(Adaptee):适配者即被适配的角色,他是被访问和适配的现存组件库中的组件接口;
  • 适配器类(Adapter):是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按照目标接口的格式访问适配者;

3.适配器模式的实现

适配器模式有两种实现方式:类适配器(用继承关系来实现)、对象适配器(用组合关系来实现);类适配器模式的耦合度比后者高,且要求了解现有组件库中的相关组件的内部结构,所以应用少;

【实例】

假设有一天电脑只能读取SD卡的信息,如果想要使用电脑读取TF卡的内容,就需要将TF卡加上卡套转成SD卡;

3.1 类适配器模式

SD卡接口

java 复制代码
public interface SDCard {
    //读取SD卡方法
    String readSD();
    //写入SD卡功能
    void writeSD(String msg);
}

SD卡实现类

java 复制代码
public class SDCardImpl implements SDCard {
    @Override
    public String readSD() {
        String msg = "sd card reading data";
        return msg;
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("sd card write data : " + msg);
    }
}

TF卡接口

java 复制代码
public interface TFCard {

    //读取TF卡方法
    String readTF();
    //写入TF卡功能
    void writeTF(String msg);
}

TF卡实现类

java 复制代码
public class TFCardImpl implements TFCard {

    @Override
    public String readTF() {

        String msg = "tf card reading data";
        return msg;
    }

    @Override
    public void writeTF(String msg) {
        System.out.println("tf card write data : " + msg);
    }
}

定义适配器类(SD兼容TF)

java 复制代码
public class SDAdapterTF extends  TFCardImpl implements SDCard{

    @Override
    public String readSD() {
        System.out.println("adapter read tf card ");
        return readTF();
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        writeTF(msg);
    }
}

客户端

java 复制代码
public class Client {

    public static void main(String[] args) {

        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.read(sdCard));

        SDAdapterTF adapterTF = new SDAdapterTF();
        System.out.println(computer.read(adapterTF));
    }
}

3.2 对象适配器模式

对象适配器可采用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口;

适配器类

java 复制代码
public class SDAdapterTF implements SDCard{

    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard) {
        this.tfCard = tfCard;
    }

    @Override
    public String readSD() {
        System.out.println("adapter read tf card ");
        return tfCard.readTF();
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        tfCard.writeTF(msg);
    }
}

客户端

java 复制代码
public class Client {

    public static void main(String[] args) {

        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.read(sdCard));

        TFCard tfCard = new TFCardImpl();
        SDAdapterTF adapterTF = new SDAdapterTF(tfCard);
        System.out.println(computer.read(adapterTF));
    }
}
相关推荐
七星静香9 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员9 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU10 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie613 分钟前
在IDEA中使用Git
java·git
Elaine20239128 分钟前
06 网络编程基础
java·网络
G丶AEOM30 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201331 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀32 分钟前
LRU缓存算法
java·算法·缓存
镰刀出海35 分钟前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel