适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

介绍

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

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何解决:继承或依赖(推荐)。

关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

demo


入口类

package adapter_method_mod;import org.junit.Test;/*** 在我们的应用程序中我们可能需要将两个不同接口的类来进行通信,* 在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。* 这个中间件就是适配器。所谓适配器模式就是将一个类的接口,转换成客户期望的另一个接口。* 它可以让原本两个不兼容的接口能够无缝完成对接。* 作为中间件的适配器将目标类和适配者解耦,增加了类的透明性和可复用性。*/
public class Client {@Testpublic void test(){Tiger tiger = new Tiger();tiger.play("run","伏地虎");//原来伏地虎只会跑tiger.play("fly","伏地虎");//通过适配器实现伏地虎会飞tiger.play("swim","伏地虎");//通过适配器实现伏地虎会游泳tiger.play("jump","伏地虎");//暂未实现的行为//        伏地虎 can run//        伏地虎 can fly//        伏地虎 can swim//        Invalid type. jump format not supported}
}

要进行适配的对象,老虎

package adapter_method_mod;/*** Target:目标抽象类* 陆禽实现类 老虎会跑* 通过适配器实现 虎会飞,虎会游泳*/
public class Tiger implements TerrestrialBirds {ForTigerAdapter forTigerAdapter;@Overridepublic void play(String type, String name) {if(type.equals("run")){System.out.println(String.format("%s can %s",name,type));}else if(type.equals("fly")||type.equals("swim")){//调用适配器forTigerAdapter = new ForTigerAdapter(type);forTigerAdapter.play(type, name);}else{System.out.println(String.format("Invalid type. %s format not supported",type));}}
}

适配器类

package adapter_method_mod;/*** Adapter:适配器类* 适配器  属于结构型模式* 优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。** 缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。**/
public class ForTigerAdapter implements TerrestrialBirds{FlyBirds flyBirds;public ForTigerAdapter(String type){if("fly".equals(type)){flyBirds = new Owl();}else if("swim".equals(type)){flyBirds = new Cormorant();}}@Overridepublic void play(String type, String name) {if("fly".equals(type)){flyBirds.playFly(name);}else if("swim".equals(type)){flyBirds.playSwim(name);}}
}

目标的接口类

package adapter_method_mod;/*** 陆禽接口* 目标接口类*/
public interface TerrestrialBirds {public void play(String type,String name);
}

适配者的接口类

package adapter_method_mod;/*** 飞禽接口* Adaptee:适配者类*/
public interface FlyBirds {public void playFly(String name);public void playSwim(String name);
}

适配者的实例化 鹰

package adapter_method_mod;/*** 飞禽实现类,鹰会飞*/
public class Owl implements FlyBirds {@Overridepublic void playFly(String name) {System.out.println(String.format("%s can fly",name));}@Overridepublic void playSwim(String name) {// not do something}
}

适配者的实例化 鸬鹚

package adapter_method_mod;/*** 飞禽实现接口 鸬鹚会游泳* 大型的食鱼游禽,善于潜水,潜水后羽毛湿透,需张开双翅在阳光下晒干后才能飞翔*/
public class Cormorant implements FlyBirds{@Overridepublic void playFly(String name) {//not do something}@Overridepublic void playSwim(String name) {System.out.println(String.format("%s can swim",name));}
}

(六)JAVA设计模式23种设计模式之适配器模式实例demo相关推荐

  1. Java进阶 23种设计模式 详解+应用+实例代码

    文章目录 前言 设计模式六大原则 1.单一原则 (1) 概念 (2) 优点 2.开闭原则 (1) 概念 3.里氏替换原则 (1) 概念 4.依赖倒置原则 (1) 概念 (2) 作用 5.接口隔离原则 ...

  2. java 的23种设计模式 之单身狗和隔壁老王的故事

    2019独角兽企业重金招聘Python工程师标准>>> 觉得代码写的别扭了,回头翻翻java 的23种设计模式. today,额,这么晚了,困了.就弄个最简单的单例模式吧. 单例模式 ...

  3. 经典:从追MM谈Java的23种设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 从追MM谈Java的23种设计模式1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然 ...

  4. 从追MM谈Java的23种设计模式

    设计模式做为程序员的"内功心法",越来越受到.net 社区的重视,这种变化是很可喜的,Java社区走在了我们的前面,但这种状况 也许有一天会发生改变. {虽然有点长,但是相信相当经 ...

  5. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  6. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  7. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  8. java与23种设计模式

    1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...

  9. Java中23种设计模式(随时不定时更新)

    一.创建型模式 1.单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  10. java 的23种设计模式 单例模式

    23种设计模式友情链接: 点击打开链接 单例模式: A.饿汉式单例模式 具体步骤: 1.声明一个私有的静态的最终的本类类型的对象并实例化 private static final Person ins ...

最新文章

  1. 无监督机器学习中,最常见4类聚类算法总结 | 技术头条
  2. 追番必备,动漫角色也可以用人脸识别了
  3. Just enough(刚刚好)的软件开发文档什么样?
  4. Linux下paste命令详解
  5. 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
  6. python适合机器视觉_Python机器视觉编程常用数据结构与示例
  7. Mysql之事务与视图
  8. 按键精灵手机助手之实战篇(二)防封
  9. 依据CCS分类建树(简单方案)
  10. Excel查看工作表有多少列
  11. pycharm出现 Pycharm this applicatation failed to start because it could not find or laod the qt 的解决办法
  12. 使用Termux软件在安卓手机上安装ubuntu
  13. 【洛谷P1970】花匠【贪心】
  14. make编译打印详细日志
  15. 与 Oh My Zsh 不可错过的邂逅:如何离线安装 Oh My Zsh
  16. go 发送nats消息提示no response from stream
  17. 欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干,包含轴点动,回零
  18. Apriltag使用
  19. 提高电脑运行速度有高招
  20. 华为OD机试题【热点网络统计】用 Java 解 | 含解题说明

热门文章

  1. LessLyrics 苹果Mac歌词软件 iTunes歌词助手
  2. studing(来自转载)
  3. 同相放大器、反相放大器的区别与优劣
  4. 4.加载FeatureLayer
  5. 设置用户ID位是什么意思
  6. 视频剪辑完成,应该如何给视频配音?三种配音方法快来学
  7. TestCenter测试管理工具功能详解三(H)
  8. Js验证身份证是否正确
  9. Exec format error问题的原因
  10. windowbuilder怎么加背景图_抖音吸粉新套路,主页背景图太太太太有心机了