您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

适配器模式:如何让不兼容的接口变得兼容

时间:2023-09-06 11:59:47  来源:  作者:waynaqua

在软件开发中,我们经常会遇到这样的情况:我们需要使用一个现有的类或者接口,但它与我们系统的目标接口不兼容,而我们又不能修改它。这时候,我们该怎么办呢?大多数情况下我们都可以使用适配器模式来解决这个问题,本文将从以下四个方面讲解适配器模式。

  • 简介
  • 优缺点
  • 应用场景
  • JAVA 代码示例

简介

适配器模式(Adapter Pattern)是一种结构型设计模式,它可以将一个接口转换成客户端所期待的另一个接口,从而使原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式也称为包装器模式(WrApper Pattern),因为它通过一个包装类(即适配器)来包装不兼容的接口,并提供统一的目标接口。适配器模式可以在运行时根据需要选择不同的适配器来适配不同的被适配者。

图片

对象适配器模式的各角色定义如下。

  • Target(目标接口):客户端要使用的目标接口标准,对应下文中的三相插孔接口 TriplePin。
  • Adapter(适配器):实现了目标接口,负责适配(转换)被适配者的接口 specificRequest()为目标接口 request(),对应本章下文中的电视机专属适配器类 TriplePinAdapter。
  • Adaptee(被适配者):被适配者的接口标准,目前不能兼容目标接口的问题接口,可以有多种实现类,对应下文中的两相插孔接口 DualPin。
  • Client(客户端):目标接口的使用者。

优缺点

适配器模式的优点有:

  • 适配器模式可以增强程序的可扩展性,通过使用适配器,可以在不修改原有代码的基础上引入新的功能或者接口。
  • 适配器模式可以提高类的复用性,通过使用适配器,可以将已有的类或者接口重新组合和封装,使其符合新的需求。
  • 适配器模式可以增加类的透明度,通过使用适配器,客户端只需要关注目标接口,而无需了解被适配者的具体实现。
  • 适配器模式可以灵活地切换不同的被适配者,通过使用不同的适配器,可以动态地选择不同的被适配者来满足不同的场景。

适配器模式的缺点有:

  • 适配器模式会增加系统的复杂性,过多地使用适配器会使系统变得零乱和难以理解。
  • 适配器模式可能会降低系统的性能,因为每次调用目标接口时都需要经过适配器的转换。
  • 适配器模式可能会违反开闭原则,如果目标接口发生变化,则需要修改所有的适配器类。

应用场景

适配器模式适用于以下场景:

  • 当需要在一个已有系统中引入新的功能或者接口时,它与系统的目标接口不兼容,但又不能修改原有代码时,可以使用适配器模式。例如在一个数据库操作系统中,如果想要支持多种类型的数据库源,但系统只提供了一个固定类型数据库源的操作接口时,可以使用一个数据库源操作适配器来将不同类型数据库源转换成统一类型数据库源。
  • 当需要在多个独立开发的系统或者组件之间进行协作时,但由于各自采用了不同的接口或者协议时,可以使用适配器模式。例如在一个分布式服务系统中,如果想要让不同语言编写的服务之间进行通信和调用,但各自采用了不同的通信协议和数据格式时,可以使用一个服务通信适配器来将不同协议和数据格式转换成统一协议和数据格式。

Java 代码示例

举一个生活中常见的实例,我们新买了一台电视机,其电源插头是两相的,不巧的是墙上的插孔却是三相的,这时电视机便无法通电使用,我们以代码来重现这个场景。

  1. 定义目标接口:三相插口 TriplePin,其中 3 个参数 l、n、e 分别对应火线(live)、零线(null)和地线(earth)。
public interface TriplePin {

    public void electrify(int l, int n, int e);
}
  1. 定义被适配者接口:两项插口 DualPin,可以看到参数中缺少了地线 e 参数。
public interface DualPin {

    public void electrify(int l, int n);
}
  1. 添加被适配者接口具体实现类:TV,可以看到 TV 实现的是两相接口,所在无法直接在三项接口中使用。
public class TV implements DualPin {
    @Override
    public void electrify(int l, int n) {
        System.out.println("火线通电:" + l + ",零线通电:" + n);
        System.out.println("电视开机");
    }
}
  1. 定义适配器类:三项接口适配器 TriplePinAdapter,实现了三项接口并且包含两项接口属性,在 electrify 方法中调用被适配设备的两插通电方法,忽略地线参数 e,以此来完成三项接口对两项接口的兼容。

这也就意味着 TriplePinAdapter 类能帮助我们将 TV 类与三项接口兼容。

public class TriplePinAdapter implements TriplePin {

    private DualPin dualPin;

    public TriplePinAdapter(DualPin dualPin) {
        this.dualPin = dualPin;
    }

    @Override
    public void electrify(int l, int n, int e) {
        // 调用被适配设备的两插通电方法,忽略地线参数e
        dualPin.electrify(l, n);
    }
}
  1. 定义客户端类
public class Client {

    public static void mAIn(String[] args) {
        DualPin dualPinDevice = new TV();
        TriplePin triplePinDevice = new TriplePinAdapter(dualPinDevice);
        triplePinDevice.electrify(1, 0, -1);
    }
}

输出结果如下:

火线通电:1,零线通电:0
电视开机

总结

图片

通过利用适配器模式对系统进行扩展后,我们就不必再为解决兼容性问题去暴力修改类接口了,转而通过适配器,以更为优雅、巧妙的方式将两侧“对立”的接口“整合”在一起,顺利化解双方难以调和的矛盾,最终使它们顺利接通。



Tags:兼容   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
让软件支持多个Linux发行版,动态库不兼容?3种解法!
从开发者面对的动态库,对Linux发行版兼容性差的缺点和痛点出发,本文梳理问题、探讨并分享3种解决思路。Linux系统如何知道哪些路径下有动态链接库可供链接加载?可借助ldconfig...【详细内容】
2024-01-09  Search: 兼容  点击:(63)  评论:(0)  加入收藏
手机操作系统三分天下,鸿蒙系统明年将不兼容安卓?回应来了
近日,有消息称华为可能明年推出不兼容安卓的鸿蒙版本。11月20日,据澎湃新闻报道,一华为相关人士表示,推出时间还不确定,未来IOS、鸿蒙、安卓将为三个各自独立的系统。稍早前据证...【详细内容】
2023-11-20  Search: 兼容  点击:(119)  评论:(0)  加入收藏
不再兼容安卓!华为鸿蒙原生应用时代即将到来,美团等多家大厂加入开发
华为鸿蒙原生应用开发正在加速中。11月13日,华为鸿蒙生态迎来一个重磅的合作伙伴,华为宣布和美团以HarmonyOS为基础进行产业创新、技术应用、商业发展等方面展开全面合作,全力...【详细内容】
2023-11-14  Search: 兼容  点击:(121)  评论:(0)  加入收藏
华为“纯血鸿蒙”有看头了!不再兼容安卓,原生应用密集启动
在今年 8 月举行的华为 HDC2023 大会中,华为不仅发布了全新一代的鸿蒙系统 HarmonyOS 4,还推出了HarmonyOS NEXT开发者预览版。当时,华为表示 HarmonyOS NEXT 先行面向合作企业...【详细内容】
2023-11-13  Search: 兼容  点击:(133)  评论:(0)  加入收藏
电脑装独立显卡后无法正常显示:驱动、兼容性、电源和线缆问题
当电脑装上独立显卡后无法正常显示,只能使用核心显卡的情况下,可能存在以下几种原因:一、驱动程序问题显卡驱动程序是控制显卡工作的软件,如果没有正确安装或驱动程序已经损坏,会...【详细内容】
2023-11-04  Search: 兼容  点击:(222)  评论:(0)  加入收藏
浏览器设置兼容性视图的方法
近期有很多小伙伴咨询小编IE9 浏览器怎么设置兼容性视图,接下来就让我们一起学习一下IE9 浏览器设置兼容性视图的方法,希望可以帮助到大家。IE9 浏览器怎么设置兼容性视图?IE9...【详细内容】
2023-09-21  Search: 兼容  点击:(315)  评论:(0)  加入收藏
适配器模式:如何让不兼容的接口变得兼容
在软件开发中,我们经常会遇到这样的情况:我们需要使用一个现有的类或者接口,但它与我们系统的目标接口不兼容,而我们又不能修改它。这时候,我们该怎么办呢?大多数情况下我们都可以...【详细内容】
2023-09-06  Search: 兼容  点击:(247)  评论:(0)  加入收藏
三分天下!华为鸿蒙将不再兼容安卓
曾经的全球移动操作系统领域,长期以来市场格局一直是安卓、IOS所主导,但在老美的长臂管辖之下,安卓丢失“中立性”成了老美钳制竞争对手的工具,一度导致华为丢失谷歌GMS授权,缺少...【详细内容】
2023-08-08  Search: 兼容  点击:(105)  评论:(0)  加入收藏
帮助你解决电脑的兼容问题
兼容性问题是计算机使用过程中常见的问题之一。在使用电脑的过程中,我们可能会遇到软硬件兼容的问题和情况。此问题可能会导致软件无法正常运行、出错或崩溃。本文将介绍软件...【详细内容】
2023-07-12  Search: 兼容  点击:(217)  评论:(0)  加入收藏
软件兼容性测试怎么进行?兼容性测试有什么作用?
兼容性测试软件兼容性测试是指在多个操作系统、浏览器、设备或数据库平台上运行软件,并检查其功能和性能的测试。具体来说,兼容性测试可以包括以下内容:操作系统兼容性测试:在不...【详细内容】
2023-06-04  Search: 兼容  点击:(276)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条