适配器模式

哈喽大家好,四月份啦!!!很高兴在这里与大家再次相遇,我相信大家都是热爱技术的伙计们,也正是因为有你们的支持和陪伴,小应学长在2022年第三季新星计划内获得Java后端Top3,这也是导师和大家对我创作的肯定,我将继续努力写出通俗易懂的技术文章,但是小应学长难免有不足之处,也有粗心大意的时候,在这里恳请大家批评指正! 那么我们四月份的文章,就在这里开始吧~~


1、什么是适配器模式?

其实适配器这三个字大家应该很熟悉,我们知道苹果公司的手机iPhone已经不提供充电插头了,包装盒内只有一根数据线,那么我们无法单独使用这根数据线进行在220V的插板上充电,因此我们需要重新购买一个适配器来把插板和手机连接起来,这就是适配器

其实在软件设计中也可能出现,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。


2、适配器模式的定义

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

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


3、适配器模式的优缺点

优点:

  1. 客户端通过适配器可以透明地调用目标接口
  2. 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
  3. 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
  4. 在很多业务场景中符合开闭原则

缺点:

  1. 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性
  2. 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱

4、适配器模式的结构与实现

(以下结构参考自互联网)

模式的结构

  1. 目标(Target)接口: 当前系统业务所期待的接口,它可以是抽象类或接口
  2. 适配者(Adaptee)类: 它是被访问和适配的现存组件库中的组件接口
  3. 适配器(Adapter)类: 它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者

类适配器模式的结构:

对象适配器模式的结构:

5、适配器模式的代码实现

A、使用组合的方式实现适配器:

我们现在有一台笔记本电脑的插头的三相的,但是我们现在需要使用二相的插头进行充电,所以我们需要给这个插头装上一个二相的适配器:

三相插座接口:

/*** 三相插座接口*/
public interface ThreePlugIf {//使用三相电流供电public void powerWithThree();}

国标的二相插座:

/*** 国标的二相插座*/
public class GBTowPlug {public void powerWithTwo(){System.out.println("使用二相电流供电");}
}

笔记本:

/*** 笔记本*/
public class NoteBook {private ThreePlugIf plug;public NoteBook(ThreePlugIf plug){this.plug = plug;}//使用插座充电public void charge(){plug.powerWithThree();}
}

三相转二相的插座适配器:

/*** 三相转二相的插座适配器*/public class TwoPlugAdapter implements ThreePlugIf {private GBTowPlug plug;public TwoPlugAdapter(GBTowPlug plug) {this.plug = plug;}@Overridepublic void powerWithThree() {System.out.println("通过转换");plug.powerWithTwo();}
}

测试类:

public class Test {public static void main(String[] args) {GBTowPlug two = new GBTowPlug();ThreePlugIf three = new TwoPlugAdapter(two);NoteBook nb = new NoteBook(three);nb.charge();}
}

输出结果:


通过转换
使用二相电流供电

采用组合方式的适配器称为对象适配器

特点:
把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装给适配者

B、使用继承的方式实现适配器:

继承适配器:

/*** 采用继承方式的插座适配器*/
public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{@Overridepublic void powerWithThree() {System.out.println("借助继承适配器");this.powerWithTwo();}
}

测试类:

public class Test {public static void main(String[] args) {GBTowPlug two = new GBTowPlug();ThreePlugIf three = new TwoPlugAdapter(two);NoteBook nb = new NoteBook(three);nb.charge();//使用继承方法three = new TwoPlugAdapterExtends();nb = new NoteBook(three);nb.charge();
}
}

输出:

通过转换
使用二相电流供电借助继承适配器
使用二相电流供电

采用继承方式的称为类适配器

特点:

通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配


6、适配器模式的应用场景

  1. 之前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致
  2. 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同

最后,祝大家假期愉快~~~~

Java真的不难(三十五)适配器模式相关推荐

  1. java并发编程(三十五)——公平与非公平锁实战

    前言 在 java并发编程(十六)--锁的七大分类及特点 一文中我们对锁有各个维度的分类,其中有一个维度是公平/非公平,本文我们来探讨下公平与非公平锁. 公平|非公平 首先,我们来看下什么是公平锁和非 ...

  2. Java入门(三十五)

    Map集合概述和特点 map由两部分组成,k是map集合里面存储键的类型,v是map里面存储值的类型. map集合是一个接口,将键映射到值的对象,他不能包含重复的键,每个键可以映射到一个值. 举例,比 ...

  3. Java基础(三十五)Math、Random类和数字格式化(String.format方法)

    一.Math类 Math类常用的方法: public static long abs (double a) 返回a的绝对值 public static double max (double a,dou ...

  4. Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同

    CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...

  5. Java Review(三十六、IO)

    文章目录 File 类 访问文件和目录 1.访问文件名相关的方法 2. 文件检测相关的方法 3. 获取常规文件信息 4. 文件操作相关的方法 5. 目录操作相关的方法 文件过滤器 IO流概览 流的分类 ...

  6. 三十五、深入Java中的泛型(下篇)

    @Author:Runsen @Date:2019年10月26日 17:10:34 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...

  7. 【零基础学Java】—System类(三十五)

    [零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...

  8. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  9. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  10. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

最新文章

  1. HashTable, HashMap, LinkedHashMap, ConcurrentHashMap
  2. linux基础命令 echo
  3. opencv学 之图像傅里叶变换dft
  4. 你的网站被“白名单”了吗?
  5. linux php mysqldump,Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)
  6. python defaultdict 递归_在Python中使用defaultdict初始化字典以及应用方法
  7. Excel使用VBA小程序的方法
  8. 魅族 刷机android 6.0,魅族MX6如何刷机升级 魅族MX6升级方法【详解】
  9. php-screw 安装,php_screw安装,使用
  10. 什么是 promise?
  11. 转载-酷狗音乐API
  12. mysql修改系统日期_修改系统和MySQL时区
  13. mysql查询余额变化,SQL查询解决方案-逐日余额
  14. imgui Study
  15. SDUT 2055-来淄博旅游
  16. java后台Controller下载文件方法
  17. linux软件下载管理
  18. C51串口的SCON寄存器及工作…
  19. 我的创作纪念日——“永远相信美好的事情即将发生”
  20. 利用ESP8266与米思齐从零制作模拟温室大棚--介绍篇

热门文章

  1. echarts 环形进度图
  2. 交了19.9元瑞文IQ测试被坑后,手写了一个自己慢慢测~
  3. android程序如何加密软件,如何在Android手机上隐藏(加密)文件夹(软件)
  4. [Cesium] 使用primitive绘制多段线
  5. SpringBoot入门-分组校验
  6. IDL--辐射定标(Radiometric Calibration )
  7. Android免Root录屏
  8. C#异常提示.WAV,MP3等文件不是一个有效的波形文件
  9. 浅析百度爱采购运营推广的可信度@运营猫工具箱
  10. Oracle Discoverer 11.1.1.7安装以及与Oracle EBS R12.1.3的集成