设计模式——适配器模式(类适配器、对象适配器)

是什么?

  我们平时的有线耳机接口分为USB的和Type-C的接口,但是手机的耳机插口却只有一个,像华为的耳机插口现在基本都是Type-c的,那如果我们现在只有USB接口的耳机怎么办呢,这个时候就需要使用到一个转换器,这个转换器是USB接口的,插入USB插口中,然后它的背面可供Type-C的接口插入,最终实现一个转换效果,这其实就是使用到了适配器模式;

  因此适配器模式就是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;

  适配器模式分为类适配器模式对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些;

结构

目标接口:当前系统业务所期待的接口,它可以是抽象类或接口;

适配者类:它是被访问和适配的现存组件库中的组件接口;

适配器类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者;

实现

类适配器

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件;

目标接口


public interface USB {
    //目标接口
    void connectByUsb();
}
public class IUSBImpl implements USB{
    @Override
    public void connectByUsb() {
        System.out.println("连接USB接口");
    }
}

适配者类

//适配器
public class Adapter extends ITypeCImpl implements USB{
    @Override
    public void connectByUsb() {
        System.out.println("使用适配器");
        connectByTypeC();
    }
}

适配器类

//适配器
public class Adapter extends ITypeCImpl implements USB{
    @Override
    public void connectByUsb() {
        System.out.println("使用适配器");
        connectByTypeC();
    }
}

使用

public class Phone {
    public void connectHeadset(USB usb){
        usb.connectByUsb();
    }
}
public class Consumer {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Adapter adapter = new Adapter();
        IUSBImpl usb = new IUSBImpl();
        phone.connectHeadset(usb);
        System.out.println("==========================");
        phone.connectHeadset(adapter);
    }
}

       我们可以这样理解:我们原来使用USB接口直接连接手机的USB接口,而现在我们手里的耳机是TypeC接口,因此是不能直接连接手机接口的,我们只能连接转换器(适配器),然后让转换器帮我们转换然后去连接手机的USB接口;

缺点

类适配器模式违背了合成复用原则,类适配器是客户类有一个接口规范的情况下可用,反之则不可用;也就是说如果我们的适配器是实现了USB接口规范的,但如果它本身没有这个接口规范,而只有单单一个类的情况下就没办法使用了(继承只能单继承)

对象适配器

实现方式:对象适配器模式可采用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口;

目标接口

public interface USB {
    //目标接口或目标对象
    void connectByUsb();
}
public class IUSBImpl implements USB {
    @Override
    public void connectByUsb() {
        System.out.println("连接USB接口");
    }
}

适配者类

public interface TypeC {
    //适配者
    void connectByTypeC ();
}
public class ITypeCImpl implements TypeC {
    @Override
    public void connectByTypeC() {
        System.out.println("使用Type-C接口连接");
    }
}

适配器类

//适配器
public class Adapter  extends IUSBImpl {
    //聚合适配者类
    private TypeC typeC;

    public Adapter(TypeC typeC) {
        this.typeC = typeC;
    }

    @Override
    public void connectByUsb() {
        System.out.println("适配器连接USB接口");
        typeC.connectByTypeC();
    }
}

使用

public class Phone {
    public void connectHeadset(USB usb){
        usb.connectByUsb();
    }
}
public class Consumer {
    public static void main(String[] args) {
        Phone phone = new Phone();
        IUSBImpl usb = new IUSBImpl();
        //直接使用USB连接
        phone.connectHeadset(usb);
        System.out.println("==========================");

        ITypeCImpl typeC = new ITypeCImpl();
        Adapter adapter = new Adapter(typeC);
        //通过适配器连接
        phone.connectHeadset(adapter);
    }
}

简单来说,我们在适配器中没有直接去继承适配者的实现类,而是聚合了适配者类,这样的话无论我们的目标对象不管是类还是接口都可以完美实现了,且符合合成复用原则;

注意:还有一个适配器模式是接口适配器模式,当不希望实现一个接口中所有方法的时候,可以创建一个抽象类Adapter,实现所有方法,而此时我们只需要继承该抽象类即可,比较简单就不再过多赘述;

使用场景

1.以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致;

2.使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同;

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

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

相关文章

公路交通气象站——提供及时的交通气象信息服务

我国幅员辽阔,跨经纬度广,气候多样。从气候类型划分:可以分为季风气候、温带大陆性气候和高寒气候。 气象的变化也在直接影响着我国各个地区的道路建设及通行,由于部分路段地势险峻伴随恶劣的气象变化,会直接影响驾驶人…

Java 10 字符串

1.API 1.1API 概述 什么是API ​ API (Application Programming Interface) :应用程序编程接口 java 中的 API ​ 指的就是 JDK 中提供的各种功能的 Java 类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只…

LeetCoed 2, 23, 25, 112, 113

文章目录 1. 两数相加2. K 个一组翻转链表3. 合并 K 个升序链表4. 路径总和I5. 路径总和II 1. 两数相加 题目详情见: LeetCode2. 两数相加 题目描述相对来说比较绕, 我们可以直接理解为两个多位的整数相加, 只不过整数的每一位都是通过链表进行存储; 比如, 整数 342, 通过链表…

三分钟教你Mac下安装VmWare虚拟机

大数据课程课前环境准备:mac中安装三台linux服务器 一、课前准备 准备一台内存最少8G(建议16G)、cpu i7 4核的电脑 二、课堂主题 安装虚拟化软件VMware准备3台linux虚拟机 三、课堂目标 完成mac下3个虚拟机的安装 四、知识要点 文档说…

浅析智慧充电桩云平台的技术设计方案

自从我国提出“新基建”以来,充电基础设施产业也成为行业的话题与关注焦点。据数据统计,2021年,中国新能源汽车保有量达到784万辆,预计2025年,中国新能源汽车保有量达到2672万辆,2025年充电桩数量将达到654…

【沐风老师】一步一步教你在3dMax中进行UVW贴图和展开UVW的方法

将简单或程序材质应用于对象并不难。但是当表面需要在其上显示某种纹理时,它会变得更加复杂。任何纹理贴图都放在材质的 Diffuse 插槽中,但渲染的结果可能无法预测。这就是为什么我们需要了解 3DMAX 如何将纹理应用于 3D 对象,什么是 UVW 贴图…

weblogic ssrf 漏洞复现

一.前言 Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。 二.环境搭建 在docker中开启环境 sudo docker-compose up -d sudo docker-compose ps #查看状态访问http://your-ip:7001/uddiexpl…

【数码】收音机,德生PL380使用教程与注意事项

文章目录 1、主界面功能介绍(注意闹钟和自动关机)2、电池和电池模式的匹配3、收音机天线与信号,耳机与噪音F、参考资料 1、主界面功能介绍(注意闹钟和自动关机) 红色的按钮:power 按一下开机,按…

25个著名的WordPress网站案例

想创建免费网站吗?从易服客建站平台开始 500M免费空间,可升级为20GB电子商务网站 创建免费网站 WordPress 内容管理系统为全球35%的网站提供支持。鉴于目前有 17 亿个站点,并且还在增加,您可以算出每秒向网站访问者提供内容的W…

牛客网剑指offer|中等题day2|JZ22链表中倒数最后k个结点(简单)、JZ35复杂链表的复制(复杂)、JZ77按之字形顺序打印二叉树(中等)

JZ22链表中倒数最后k个结点(简单) 链接:链表中倒数最后k个结点_牛客题霸_牛客网 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指…

一、PEMFC基础之热力学

一、PEMFC基础之热力学 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图2.可逆电压与温度和压力的关系3.能斯特方程4.燃料电池效率 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图 2.可逆电压与温度和压力的关系 标准状态可逆电压Er计算: E …

基于springboot的4S店车辆管理系统(源码等)

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

Linux进程状态及优先级

本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 进程状态及优先级 前言正文进程状态就绪运行状态R阻塞睡眠状态 S休眠状态D挂起 暂停状态T前台与后台进程待追踪暂停状态t 死亡状态 X僵尸状态 Z 孤儿进程进程优先级查…

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及,美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时,实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是,在享受美颜SDK带来的便利的同时,我们也需要关注美颜SDK的隐私保护与…

配置文件Application.properties

配置文件Application.properties 属性配置配置文件的多种格式yaml的数据格式读取yaml文件中的属性值读取yaml文件中的全部属性yaml文件 数据库的属性 属性配置 在application.properties中添加server.port端口号即可 # 服务器端口配置 server.port80# 修改banner 关闭banner …

两分钟成为 ChatGPT 国内高手【不要再拿ChatGPT当百度用了】

不要再问ChatGPT那些问百度的问题了,有更进阶的用法 更高效的编写prompts,以便ChatGPT给出更精准的回答 但是需要注意的是:国内现在根本没有GPT-4使用,但凡是说有GPT-4的都是骗子。 GPT 可以写文章,可以写诗&#x…

MATLAB实现建筑热平衡模型建立及节能温控方案

全球大约1/3的能源消耗于建筑。在能源紧张的今天,如何减少建筑的能源浪费是一个值得研究的课题。 本文在综合国内外建筑能耗模拟方法的基础上,采用热平衡法,针对一小型建筑建立了热特性仿真模型,选用武汉地区的气象数据&#xff…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节,对于快递公司来说,每天有那么多的快递,如果没有一个好用的管理系统的话,不仅麻烦还很容易出现纰漏,所以快递出入库管理APP软件就显得很必要了。 快递…

【ChatGPT】你会是被AI抢饭碗的那类人吗?

文章目录 前言一、AI替代“基础性工作”,二、AI没有魔法:人类做不到,它也做不到三 人类的恐惧:被替代、被超越四 AI让语言返祖,小语种与文化“濒危灭绝”五 人类的未来,教育何去何从?总结 前言 …

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ(现在称为如 Apache Tomca…