设计模式之旅—适配器模式

适配器模式分析思路介绍:

  • 适配器模式的介绍
  • 适配器模式的实战(类、对象、接口三种适配器模式)
  • 适配器模式的总结

一、适配器模式的介绍

  • 概念: 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,将某个类的接口转换成客户期望的接口表现形式。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
  • 主要解决: 主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
  • 案例场景描述: 上一节中我们提到小明请假的事情,最终在小明个人让步和对领导的一再说服下,领导批准了小明10天的假期(请个假是真的难,还看什么秋景呀!这下一定要好好出去玩玩!!!),小明兴致勃勃的和小黄策划着这十天的假期,两人最终决定去泰国游玩,看一看有名的人妖网红,所以就收拾了衣物和相关智能设备的配件便踏上了旅途…!来到泰国安顿下来后,小明发现自己的phone快要没电了,然后拿出了带来的手机充电器准备充电,看了一下酒店的插座小明傻眼了(电压和插座跟国内的不匹配),难道住了一个假酒店???于是小明便去酒店咨询,酒店给小明提供了相关规格的转换器,从而小明撒欢的跑去给手机充电,最终转换器将210V的电压转为220V的电压,国内手机充电器将220V的电压转为手机适应的5V电压供手机使用,快乐的旅途便从此开始!!!

二、适配器模式的实战

1、适配器模式工作原理

1)原理图+实例的展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)图片展示的介绍

  • 用户操作和被适配者是解耦的,从用户的角度来看是看不到被适配者
  • 用户调用适配器转化后的目标接口方法,适配器再调用被适配者的相关接口方法
  • 用户收到反馈结果,感觉只是在和目标接口做交互
  • 实例中主要作用:将一个类的接口转换成另一种接口让原本接口不兼容的类可以兼容
  • 【目标(Target)接口】:当前系统业务所期待的接口,它可以是抽象类或接口
  • 【适配者(Adaptee)类】:它是被访问和适配的现存组件库中的组件接口
  • 【适配器(Adapter)类】:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
2、结合案例场景分析(三种方式)
每种方式的分析步骤:
  • 1、类图介绍
  • 2、具体代码实现
  • 3、模式小结
方式一:类适配器模式(继承的方式)
1、类图介绍

**1)单例对象的定义**

2、具体代码实现
  • 1)220V电压的定义
    在这里插入图片描述
  • 2)5V电压的定义
    在这里插入图片描述
  • 3)充电器的实现
    在这里插入图片描述
  • 4)手机类的定义
    在这里插入图片描述
  • 5)Test充电类的定义
    在这里插入图片描述
  • 6)执行结果
    在这里插入图片描述
3、模式小结
  • 被适配者的方法在Adapter中都会暴露出来,增加了使用成本
  • 由于继承了被适配者,所以可以根据需要重写被适配者中的方法,使得Adapter更加灵活
  • Java是单继承机制,所以类适配器需要继承被适配者,同时还要求目标类必须是一个接口,这样会有一定的局限性
  • 特点:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配
方式二:对象适配器模式(组合的方式)
1、类图介绍

在这里插入图片描述

2、具体代码实现
  • 1)充电器的实现
    在这里插入图片描述
  • 2)Test充电类的定义
    在这里插入图片描述
  • 3)执行结果
    在这里插入图片描述
3、模式小结
  • 使用成本更低,更加灵活
  • 对象适配器和类适配器有着同一种思想,只是实现方式不同。对象适配器模式根据合成复用原则使用组合代替继承,所以它解决了类适配器必须要继承被适配者的局限性问题,同时也不在要求目标类必须是接口的局限性
  • 特点:把"被适配者"作为一个对象组合到适配器类中,以修改目标接口包装被适配者
方式三:接口适配器模式
1、类图介绍在这里插入图片描述
2、具体代码实现
  • 1)适配器源接口的定义
    在这里插入图片描述
  • 2)适配器接口抽象类的实现(空实现便于后面调用的具体实现)
    在这里插入图片描述
  • 3)Test充电类的定义
    在这里插入图片描述
  • 3)执行结果
    在这里插入图片描述
3、模式小结
  • 适用对于一个接口不想使用其所有的方法,只对部分方法的实现场景
  • 当不需要全部实现接口提供的方法时,先定义一个抽象类实现接口,并默认实现该接口中的每一个方法(空实现),那么抽象类的子类就可以有选择的覆盖相关方法来实现相关场景的应用

三、适配器模式的总结

1、适配器模式的作用
  • 【重用】:复用了现存的类,解决了现存类和复用环境要求不一致的问题
  • 【透明】:通过适配器,客户端可以调用同一个接口,因而对客户端来说是透明的,这样做更简单、更直接、更紧凑
  • 【低耦合】:将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码,遵循了开闭原则
2、适配器模式使用的优缺点
<【优点】>
  • 灵活性好
  • 提高了类的复用(程序员不需要修改原有代码而重用现有的适配者类)
  • 增加了类的透明度(客户端通过适配器可以透明地调用目标接口)
  • 可以让任何两个没有关联的类一起运行(将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题)
<【缺点】>
  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
  • 由于 JAVA 类只能单继承,所以最多只能适配一个适配者类,而且目标类必须是抽象类
  • 同时对类适配器来说,更换适配器的实现过程比较复杂
3、适用场景
  • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式
  • 适配器不是在详细设计时添加的,而是解决正在服役的项目的问题
4、适配器模式使用注意事项
  • 类适配器:以类的形式给到Adapter中,将被适配者作为类来继承
  • 对象适配器:以对象的形式给到Adapter中,将被适配者作为一个对象来持有
  • 接口适配器:以接口的形式给到Adapter中,将被适配者作为一个接口来实现
  • 三种命名方式是根据被适配者是以怎样的形式给到Adapter中来命名的
  • 适配器最大的作用还是将原本不兼容的接口融合在一起工作
  • 当然实际开发中不止这几种情况,只要存在适配的情况都是适配器模式的应用
5、具体相关应用实例
  • 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V
  • JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式
  • 在 LINUX 上运行 WINDOWS 程序
  • JAVA 中的 jdbc
  • SpringMVC中的HandlerAdapter就是一个典型的适配器模式的实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值