设计模式——适配器模式(Adapter)

适配器模式(Adapter Pattern)是一种结构型设计模式,主要用于将一个类的接口转换成客户端所期望的另一种接口,从而使得原本因接口不兼容而无法一起工作的类能够协同工作。

适配器模式主要解决两类问题:

  1. 类的接口不兼容问题:客户端期望的接口与现有类的接口不一致,导致无法直接使用。
  2. 类的复用问题:现有类需要与其他不相关或不可预见的类协同工作,但由于接口不兼容而无法直接组合使用。

适配器模式主要分为两种类型:

  1. 类适配器模式:通过多重继承将适配器类同时继承自现有类和目标接口,以实现接口转换。在Java等不支持多重继承的语言中,通常通过接口和组合关系来实现类似的效果。
  2. 对象适配器模式:将现有类的对象作为适配器类的一个属性,通过适配器类来调用现有类的方法,从而实现接口转换。这种方式更符合“组合优于继承”的原则,因此在实践中更为常用。

适配器模式的主要优点包括:

  1. 提高了系统的灵活性和可扩展性:通过适配器模式,可以使得原本不兼容的类能够协同工作,提高了系统的灵活性。同时,由于适配器模式的实现相对独立,因此可以根据需要添加新的适配器类,从而扩展系统的功能。
  2. 复用了现有代码:适配器模式充分利用了现有类的方法和数据,无需修改现有类的代码即可实现接口转换,从而降低了开发成本。
  3. 解耦了客户端和现有类:通过适配器模式,客户端只需与适配器类进行交互,而无需直接调用现有类的方法,从而降低了客户端与现有类之间的耦合度。

适配器模式的一个典型应用场景是笔记本电脑使用三相电流而插座为二相供电的情况。在这种情况下,可以通过使用一个适配器将二相插座转换为笔记本电脑所需的三相接口,从而使得笔记本电脑能够正常充电。在这个例子中,适配器类充当了现有类(二相插座)和目标接口(三相接口)之间的桥梁,实现了接口转换和复用现有代码的目的。

以下是一个简单的Java代码示例,演示了对象适配器模式(Object Adapter Pattern)的实现。

首先,我们定义一个目标接口(Target),这是客户端所期望的接口:

public interface Target {
    void request();
}

然后,我们有一个现有的类(Adaptee),它的接口与Target不兼容:

public class Adaptee {
    public void specificRequest() {
        System.out.println("Called specificRequest()");
    }
}

现在,我们创建一个适配器类(Adapter),它实现了Target接口,并且持有一个Adaptee类型的对象,以便在request方法中调用AdapteespecificRequest方法:

public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

最后,我们有一个客户端类(Client),它使用Target接口来请求服务:

public class Client {
    public static void main(String[] args) {
        // 创建一个Adaptee对象
        Adaptee adaptee = new Adaptee();

        // 创建一个Adapter对象,并将Adaptee对象传递给Adapter
        Target target = new Adapter(adaptee);

        // 使用Target接口请求服务
        target.request();
    }
}

当你运行Client类的main方法时,会输出:

Called specificRequest()

这表明客户端通过适配器成功调用了AdapteespecificRequest方法,尽管Adaptee的接口与客户端所期望的Target接口不同。这就是适配器模式的核心思想:将一个类的接口转换成客户端所期望的另一种接口,使得原本不兼容的类能够协同工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python作业五

题目:注册登录 制作一个注册登录模块 注册:将用户填入的账户和密码保存到一个文件(users.bin) 登陆:将用户填入账户密码和users.bin中保存的账户密码进行比对,如果账户和密码完全相同 那 么登录成功,否则登录失败…

C语言(递归)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

win10安装.NET Framework 3.5(包括.net2.0和3.0)

打开控制面板 选择”程序” 点击”启用或关闭Windows功能“ 把.NET Framework 3.5选项勾选即可,若没有下载的,下载即可。 PS:如果下载过程出错,按如下流程: 右击”此电脑”选择“管理”,找到“服务和应用程序”&#x…

JAVA(三)常用类和API

目录 常用类与基础API---String String的内存结构 构造器和常用方法 字符串构建 String与其他结构间的转换 String的常用API 系列1:常用方法 系列2:查找 系列3:字符串截取 系列4:和字符/字符数组相关 系列5:开头…

Mac 解决外接移动硬盘(NTFS格式)无法写入的问题

文章目录 1. 问题描述2. 解决步骤 1. 问题描述 MacOS 可以识别 NTFS 格式的磁盘,但是默认情况下是只读模式,即无法向 NTFS 格式的磁盘写入数据。这是因为 NTFS 是 Windows 系统默认的文件系统格式,而 MacOS 对 NTFS 的写入支持是有限的。 如…

python软件开发遇到的坑-相对路径文件读写异常,不稳定

1. os.chdir()会影响那些使用相对路径读写文件的程序,使其变得不稳定,默认情况下,当前工作目录是主程序所在目录,使用os.chdir会将当前工作目录修改到其他路径。 资料: python相对路径写对了却报错是什么原因呢&#…

什么情况下 MySQL 连查询都能被阻塞?

MySQL 的锁也是不少,在哪种情况下会连查询都能被阻塞?这是一个有意思的问题。 工作中,很多开发和 DBA 可能接触较多的锁也就行锁了。对于行锁,阻塞写能理解,阻塞读实在是想不到。能阻塞读的那肯定是颗粒度更大的锁了&…

用于视频大型多模态模型(Video-LMMs)的复杂视频推理和鲁棒性评估套件

1 引言 最近,大型语言模型(LLMs)在同时处理广泛的NLP任务的同时展示了令人印象深刻的推理和规划能力。因此,将它们与视觉模态集成,特别是用于视频理解任务,催生了视频大型多模态模型(Video-LMMs)。这些模型充当视觉聊天机器人,接受文本和视频作为输入,并处理各种任务,包括视频…

技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分: 1.京东API接口介绍 2. 平台产品能力介绍 3. 业务赋能案例分享 01 京东API接口介绍 02 平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用数据分析和可视化技术&…

软件测试小妙招:详细解读 postman接口测试导入导出操作

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman中的集合脚本,环境变量、全局变量全部都可以导出,然后分享给团队…

618购物狂欢有哪些值得买的?五款心水好物真实分享!

618购物狂欢即将到来,你是不是已经迫不及待地期待着各种优惠和折扣?在这个充满购物狂欢的时刻,大家可能会犹豫在众多商品中该如何选择。不用担心!我已经为大家精心挑选了五款心水好物,并进行了真实的分享,帮…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP(动态主机配置协议)2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT(Netwo…

使用凌鲨建立软件研发技能学习小组

凌鲨(OpenLinkSaas)的团队功能除了提供论坛功能,还能记录团队成员的成长记录。 使用方法 打开团队功能 团队功能在默认情况下是关闭的,你可以在登录后打开团队功能开关。 创建学习团队 日报/周报/个人目标一般是企业团队需要,建议关闭。 …

FPGA第二篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介:首先,FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器,可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务,可以说是系统的"大脑"和"加速引擎&qu…

通过 Java 操作 redis -- set 集合基本命令

关于 redis set 集合类型的相关命令推荐看Redis - Set 集合 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Java 操作 redis -- 连接 redis 本博客只介绍了一小部分常用的命令,其他的命令根据上面推荐的博客也能很简单的使…

12大价值:揭秘可视化大屏在机械行业应用(大量案例图)

1. 生产监控: 可视化数据大屏可以实时显示机械自动化生产线的运行状态、生产进度、设备故障等信息,帮助管理人员及时了解生产情况并做出相应的决策。 2. 故障诊断: 通过可视化数据大屏,可以将机械自动化设备的故障信息以图表、…

低代码在物品领用领域数字化转型的案例分析

办公用品管理数字化不仅代表了企业管理模式的革新,更是提升运营效率和成本控制的关键举措。通过数字化手段,企业能够实现采购、库存、领用等流程的自动化和智能化管理,大幅减少人工操作,提高处理速度,确保数据的准确性…

Zabbix+Grafana-常见报错及异常处理方式记录

文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户,配置报警后,无法收到报警 Grafana安装篇Windows系统安装时,添加zabbix报错:An error occurred within the plugin Zabbix安…

STM32快速入门(串口传输之USART)

STM32快速入门(串口传输之USART) 前言 USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优…

【小迪安全2023】第61天:服务攻防-中间件安全CVE复现K8sDockeruettyWebsphere

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…
最新文章