08.适配器模式

news2025/2/25 5:31:50

08.适配器模式

概念:

将一个类的接口转化成用户需要的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式可以分为类适配器和对象适配器两种,区别在于适配器角色对应被适配角色的适配是通过继承还是组合来实现的。由于Java不支持多继承,而且会破坏封装性,所有我们提倡多用组合少用继承。

用途:

特定型号的手机只能使用特定型号的充电器充电。比如Iphone6手机只能使用Lightning接口的充电器充电。但是,如果我们身边只有一条安卓的Micro Usb充电线的话,我们能不能为苹果手机充电呢?答案是肯定的,只要有一个适配器就可以了。

2BB5D050-F606-424E-99BC-0D72AB180D53_1_105_c

在程序设计过程中我们可能也遇到类似的场景:

1、系统需要使用现有的类,而此类的接口不符合系统的需要。

2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。

3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

以上场景都适合使用适配器模式。

实现方式

适配器模式包含以下角色:

Target:目标抽象类

Adapter:适配器类

Adaptor:适配者类

Client:客户类

FC077CF8-E7F6-45BC-BAAB-57E41C695639_1_201_a

我们来针对使用适配器让安卓充电器给苹果手机充电这个例子。

(1)先定义两个充电器接口

/**
 * 安卓MicroUsb —— 充电器接口
 */
public interface MicroUsbInterface {
    public void chargeWithMicroUsb();
}

/**
 * 苹果Lightning —— 充电器接口
 */
public interface LightningInterface {
    public void chargeWithLightning();
}

(2)具体实现类:

/**
 * 安卓设备充电器 —— 充电器
 */
public class AndroidCharger implements MicroUsbInterface {
    @Override
    public void chargeWithMicroUsb() {
        System.out.println("使用MicroUsb型号的充电器充电。。。。。");
    }
}

/**
 * 苹果设备的充电器 —— 充电器
 */
public class AppleCharger implements LightningInterface {
    @Override
    public void chargeWithLightning() {
        System.out.println("使用Lightning型号的充电器充电。。。。");
    }
}

(3)定义两台手机:

/**
 * HWp10pro —— 手机
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HWP10pro {
    private MicroUsbInterface microUsbInterface;
    public void charge() {
        System.out.println("开始给我的HWp10pro手机充电。。。");
        microUsbInterface.chargeWithMicroUsb();
        System.out.println("结束给我的HWp10pro手机充电。。。");
    }
}

/**
 * 苹果6Puls —— 手机
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Iphone6Plus {
    private LightningInterface lightningInterface;
    public void charge() {
        System.out.println("开始给我的IphonePlus手机充电。。。");
        lightningInterface.chargeWithLightning();
        System.out.println("结束给我的IphonePlus手机充电。。。");
    }
}

(4)定义适配器

/**
 * MicroUsb接口转成Lightning接口 —— 适配器
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Adapter implements LightningInterface {
    private MicroUsbInterface microUsbInterface;
    
    @Override
    public void chargeWithLightning() {
        microUsbInterface.chargeWithMicroUsb();
    }
    
}

(5)测试类

public class Main {
    public static void main(String[] args) {
        final Iphone6Plus iphone6Plus = new Iphone6Plus(new AppleCharger());
        iphone6Plus.charge();

        System.out.println("-----------------");
        final HWP10pro HWP10pro = new HWP10pro(new AndroidCharger());
        HWP10pro.charge();
        System.out.println("-----------------");

        final Adapter adapter = new Adapter(new AndroidCharger());
        final Iphone6Plus iphone6Plus1 = new Iphone6Plus();
        iphone6Plus1.setLightningInterface(adapter);
        iphone6Plus1.charge();
    }
}

输出

开始给我的IphonePlus手机充电。。。
使用Lightning型号的充电器充电。。。。
结束给我的IphonePlus手机充电。。。
-----------------
开始给我的HWp10pro手机充电。。。
使用MicroUsb型号的充电器充电。。。。。
结束给我的HWp10pro手机充电。。。
-----------------
开始给我的IphonePlus手机充电。。。
使用MicroUsb型号的充电器充电。。。。。
结束给我的IphonePlus手机充电。。。

优缺点:

优点:

将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。

灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,也可以在不修改原有代码的基础上添加新的适配器类,完全符合"开闭原则"。

缺点:

过多使用适配器,会让系统非常凌乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。因此如果不是很有必要,可以不适应适配器,而是直接对系统进行重构。

对于类适配器而言,由于Java最多继承一个类,所以最多只能适配一个适配者类,而且目标类必须是抽象类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单月涨粉30w+,他们掌握引流法宝,小红书1月创作趋势是什么?

新年来到,在刚过去的1月,小红书平台涌现出哪些黑马博主?品牌在投放种草方面有何亮眼表现?为洞察小红书平台的内容创作趋势及品牌营销策略,新红推出1月月度榜单,从创作者及品牌两方面入手,解析月…

计算机网络-I/O多路复用机制

I/O多路复用机制 I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符(File descriptor是计算机科学中的一个术语,是一个用于表述指向文件的…

2.11 PID控制算法(四)补充

文章目录 1、理论1、代码3、分析3.1 比例项:3.2 比例+积分3.3 比例+积分+微分1、理论 1、代码 typedef struct {s32 Uplimit; //输出限幅s32 Downlimit; //输出限幅s32 target; // 目标输出量s3

leveldb源码解析二——SSTable

本章解析leveldb的基本组件——SSTable,SSTable一旦形成,就不会被改变,SSTable的操作有以下2种: 1、构建SSTable,在minor compaction和major compaction时,会构建SSTable,其中minor compaction是…

Opencv DNN C++ CPU 平台编译配置过程

Opencv DNN C CPU 平台编译配置过程 以下内容基于 windows 平台,实际上不同平台在基础工具齐全的情况下,编译过程差异并不大。 opencv 随着版本的更新,对于不同算子的支持也会逐步完善,所以尽量使用新的版本。 同时也可以把对应…

TCP滑动窗口协议与流量控制

谈到TCP的滑动窗口协议与流量控制,便会想起2006年去华为-3COM(现H3C公司时)面试时的场景。 当年毕业后,刚刚学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认超时重传的机制来保…

摸鱼时间,画个吃豆人玩一下

Ⅰ . 吃豆人小游戏 Canvas API(画布)是在 HTML5 中新增的标签用于在网页实时生成图像;是一个非常适合,做一些有趣的小游戏 和 动画;下面我们来简单的写一下 这个小例子 👇 文章目录Ⅰ . 吃豆人小游戏Ⅱ. 实…

学习嵌入式必读十本书,从C语言到ARM

学习嵌入式必读的十本书籍,按照C语言、数据结构、Linux、C、QT、单片机、ARM的顺序给大家推荐。 01 C语言 凡是计算机、电子、通信、自动化、机械专业的同学,大一的时候必学C语言,而且大部分高校选择的教材都是谭浩强。这本书在网上的评价褒…

【计算机程序设计思想与方法】2 什么是计算思维?

1.2 什么是计算思维? 如《【计算机程序设计思想与方法】1 什么是计算?》中所述,计算是利用计算机一步一步地执行指令来解决问题的过程,计算机科学是关于计算的科学。 正如数学家在证明数学定理时,有独特的数学思维。工程师在设计制造产品时,有独特的工程思维。艺术家在…

【验证码逆向专栏】某验“初代”滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文章未经许可禁止转载…

【算法】递归

目录1.递归概述2.何时使用递归2.1.定义是递归的2.2.数据结构是递归的2.3.问题的求解方法是递归的3.递归模型4.应用本文参考: 《数据结构教程》第 5 版 李春葆 主编 1.递归概述 (1)在定义一个过程或函数时,出现直接或者间接调用自…

【微服务】Elasticsearch文档索引库操作(二)

🚗Es学习第二站~ 🚩Es学习起始站:【微服务】Elasticsearch概述&环境搭建(一) 🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 一.索引库操作 索引库就类似数据库表,mapping映射就类…

DGIOT低代码场景部门的搭建过程

[小 迪 导读] : 通过低代码页面与konva 大屏的页面设计,围绕部门,实现应用场景快速搭建1.部门创建以及权限分配1.1 打开部门管理页面1.2新增部门1.3 权限分配,点击刚创建的部门,在菜单分配中选择总控台和设备管理(低代码平台会过滤掉非低代码…

Wandb:make visualization better than Tensorboard

Wandb:make visualization better than Tensorboard wandb :一个在线的可多人协作的多功能可视化工具包 我最开始使用的tensorboard,还写了一些相关tensorboard的脚本用于实验。tensorboard这里就不详细介绍了,相信大家都比较了解。直到尝试了…

【MySQL数据库入门】:表的约束

表的约束 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务 逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。 表的约束很多,这里主…

版本管理之Git

一.版本控制器的方式1.1集中式版本控制工具集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代 码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。 举例&#xff1…

巧用回调函数解决微信小程序与后台数据交互出现的异步问题

问题描述 微信小程序端需要发送一个包含文字与图片的表单数据给后端,我一开始的思路是先上传图片得到临时的URL,后执行POST请求将表单数据发送给后端,但后端只能获取到文字,而图片URL却始终获取不到。 问题原因 注意看我上面的思路…

目标检测研究

传统的目标检测流水线 1.候选区域生成 通过滑动窗口选择感兴趣区域Rol;使用多尺寸的输入图像和多尺度的滑动窗口识别多尺度和不同比例的目标。 ⒉特征向量抽取 常用SIFT、 Harr、HOG、SURF。 3.区域分类 常用支持向量机。 结合集成、串联学习、梯度…

3D俯视角色割草游戏模板+视频教程,免费发布 | 一周精品推荐

大家好,我是晓衡。新年开工第一周,我就被热心的开发者们感动得热泪盈眶!今天我冒死推荐几款 Creator 游戏开发资源,希望能对得起这些开发者们,同时也希望你能也有所收获。3D俯视角割草游戏视频源码B 站 UP 主『好巧啊c…

MyBatis 数据查询语句中有关于大于,小于的书写方法 及 查询时相关sql 关键字

前言 提示:这里记录的大概内容: MyBatis 数据查询语句中有关于大于,小于的书写方法 一、MyBatis MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为…