技术成神之路:设计模式(十八)适配器模式

news/2024/9/30 10:10:43 标签: 设计模式, 适配器模式

介绍

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类可以协同工作,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

1.定义


适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容而无法一起工作的类可以一起工作。

2. 主要作用


  • 接口兼容:使得两个不兼容的接口能够工作在一起。
  • 解耦:通过适配器将客户端与被适配者解耦,减少了系统的耦合性。
  • 重用性:允许现有的类在不修改的情况下被复用,提高了代码的重用性。

3. 解决的问题


  • 当现有类的接口和需求的接口不兼容时,适配器模式可以将现有接口转换成所需接口。
  • 在不修改现有类的前提下,使其能够适应新的接口需求,充分复用现有代码。

4. 模式原理


包含角色:

  1. Target(目标接口): 客户端期望的接口。
  2. Adapter(适配器): 实现了目标接口,并且持有一个被适配对象的实例。
  3. Adaptee(被适配的类): 原本存在的接口或类。

UML类图:
在这里插入图片描述
代码示例:

// 目标接口
interface Printer {
    void print(String content);
}

// 旧类(不兼容的接口)
class OldPrinter {
    void printText(String text) {
        System.out.println("OldPrinter: " + text);
    }
}

// 适配器类
class PrinterAdapter implements Printer {
    private OldPrinter oldPrinter;

    public PrinterAdapter(OldPrinter oldPrinter) {
        this.oldPrinter = oldPrinter;
    }

    @Override
    public void print(String content) {
        // 在适配器中处理图像打印的逻辑
        String textContent = convertImageToText(content);
        oldPrinter.printText(textContent);
    }

    // 假设这是一个将图像转换为文本的方法
    private String convertImageToText(String image) {
        return "Converted Image: " + image;
    }
}

调用

public class AdapterPatternDemo {
    public static void main(String[] args) {
        OldPrinter oldPrinter = new OldPrinter();
        Printer printerAdapter = new PrinterAdapter(oldPrinter);

        // 客户端使用适配器打印图像
        printerAdapter.print("SampleImage.jpg");
    }
}

打印输出

OldPrinter: Converted Image: SampleImage.jpg

适配器在我们的生活中无处不在,帮助不同系统、设备和协议之间实现兼容与互通比如电源适配器,耳机适配器,家用电器的转换插头,文件格式转换等等…

正如你想的那样,将一种不可使用的东西,通过一系列适配达到可用状态,这就是适配器模式的含义。

在Java中InputStreamReader可以被视为适配器,将字节流(InputStream)转换为字符流(Reader

InputStream inputStream = new FileInputStream("xxx.txt");
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);

Java的集合框架中,Collections类提供了多个适配器方法,例如ListIterator。它允许对List集合进行双向迭代。

 List<String> list = new ArrayList<>();
 ListIterator<String> iterator = list.listIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

在安卓中,适配器的含义是将数据转化成UI显示出来。例如RecyclerView.Adapter是一个典型的适配器模式示例。RecyclerView本身并不知道数据的来源,适配器充当了RecyclerView和数据之间的桥梁。

其实适配器真没啥介绍的,大家已经熟悉的不能再熟悉了,此篇文章就当用来帮助大家加固下对适配器模式的印象吧!😜

5. 优缺点


优点:

  1. 单一职责原则:将接口转换代码封装在适配器中,不需要修改原有类。
  2. 开闭原则:添加新的适配器,不需要修改已有代码。
  3. 提高复用性:可以复用现有类,减少代码重复。

缺点:

  1. 复杂性增加:引入适配器模式会增加系统的复杂性,增加了额外的类。
  2. 类适配器的局限性:类适配器使用多重继承,可能不适用于所有面向对象语言(如Java只支持单继承)。

6. 应用场景


  • 需要与不兼容的接口或类库进行集成。
  • 需要使用现有类的功能,但它们的接口不符合客户端的要求。
  • 在系统中需要将多个不同的接口统一为一个接口。

7. 对象适配器(Object Adapter)和类适配器(Class Adapter)区别


特性类适配器(Class Adapter)对象适配器(Object Adapter)
实现方式通过继承(类)通过组合(对象)
适配方式编译时适配运行时适配
灵活性不够灵活,适配关系固定灵活,适配对象可以在运行时更改
对变化的影响被适配类变化影响较大被适配类变化影响较小

8. 总结


适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户端期望的接口,使得原本不兼容的类可以一起工作。它主要解决接口不兼容的问题,提高代码的复用性和灵活性。虽然引入了额外的复杂性,但它在需要复用现有代码,或者在不修改源代码的前提下适应新接口需求的场景下,非常有用。适配器模式有类适配器和对象适配器两种实现方式,各自有优缺点,选择时应根据具体需求和语言特性来决定。


http://www.niftyadmin.cn/n/5684874.html

相关文章

mysql怎么修改一个字段中的所有部分数据

UPDATE videos SET VideoCode replace(VideoCode,flv,mp4); update 表名 set 字段名 replace&#xff08;字段名&#xff0c;‘修改前’&#xff0c;‘修改后’&#xff09;&#xff1b;

如何处理各行业的DDOS问题

分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是网络安全领域最为常见且危害性极大的攻击方式之一。通过控制大量计算机、物联网终端或网络僵尸&#xff0c;攻击者能够向目标网站或服务器发送大量请求&#xff0c;从而耗尽其资源&#xff0c…

【解密 Kotlin 扩展函数】扩展属性与扩展函数类似(十九)

导读大纲 1.1.1 扩展属性的创建和使用 1.1.1 扩展属性的创建和使用 之前, 我们已经了解声明 Kotlin 属性的语法 Kotlin中的顶级属性–传送门就像扩展函数一样,我们也可以指定扩展属性就像之前所说&#xff0c;属性和函数的区别在于前者是特征&#xff0c;后者是行为 相比扩展函…

智慧校园建设方案(第四章)

4 建设内容 科技职业学院数字孪生校园一张图平台包括标准规范体系建立、数据建设、数字孪生校园一张图底座、珍稀植物可视化应用、图书馆可视化应用、宿舍可视化应用、教室可视化应用、实训室可视化应用、珍稀植物养护小程序、运维管理系统和接口对接,下面分别对平台的各个功…

Ansible集群服务部署案例

案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统&#xff0c;分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…

wpa_cli支持EAP-PEAP认证运行设计

wpa_cli支持EAP-PEAP认证运行设计 1 输入 1.1 启动wpa_supplicant 和 wpa_cli 启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:…

Kafak入门技术详解

抱歉&#xff0c;没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…

Spring自动装配的5种方式

Spring自动装配的5种方式 1. no&#xff08;默认&#xff09;2. byName3. byType4. constructor5. autodetect &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring提供了五种自动装配方式&#xff0c;旨在帮助开发者简化Bean依赖的配置过…