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

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));
    }
}
相关推荐
天天被压力19 分钟前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
敲代码的小小酥22 分钟前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力28 分钟前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
apcipot_rain35 分钟前
C++转Java日记(02)
java·开发语言·c++
nice_lcj52044 分钟前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
是2的10次方啊1 小时前
设计模式与生活⑬:你坐几号线,谁来运营是另一回事
设计模式
码农小河6611 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
风若飞13 小时前
Spring Ai 入门遇到问题1
java·后端·spring
Nuanyt13 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
黑马程序员毕设14 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言