适配器模式

适配器模式(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 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

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

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

实现

我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。

我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。

步骤 1

为媒体播放器和更高级的媒体播放器创建接口。

MediaPlayer.java

public interface MediaPlayer {public void play(String audioType, String fileName);
}

AdvancedMediaPlayer.java

public interface AdvancedMediaPlayer { public void playVlc(String fileName);public void playMp4(String fileName);
}

步骤 2

创建实现了 AdvancedMediaPlayer 接口的实体类。

VlcPlayer.java

public class VlcPlayer implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: "+ fileName);      }@Overridepublic void playMp4(String fileName) {//什么也不做}
}

Mp4Player.java

public class Mp4Player implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {//什么也不做}@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: "+ fileName);      }
}

步骤 3

创建实现了 MediaPlayer 接口的适配器类。

MediaAdapter.java

public class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("vlc") ){advancedMusicPlayer = new VlcPlayer();       } else if (audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer = new Mp4Player();}  }@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}

步骤 4

创建实现了 MediaPlayer 接口的实体类。

AudioPlayer.java

public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter; @Overridepublic void play(String audioType, String fileName) {    //播放 mp3 音乐文件的内置支持if(audioType.equalsIgnoreCase("mp3")){System.out.println("Playing mp3 file. Name: "+ fileName);         } //mediaAdapter 提供了播放其他文件格式的支持else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);}else{System.out.println("Invalid media. "+audioType + " format not supported");}}
}

步骤 5

使用 AudioPlayer 来播放不同类型的音频格式。

AdapterPatternDemo.java

public class AdapterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "beyond the horizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}

步骤 6

执行程序,输出结果:

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported

SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之适配器模式相关推荐

  1. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之责任链模式

    责任链模式 推荐分布式微服务电商源码 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收 ...

  2. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之策略模式

    策略模式 推荐分布式微服务电商源码 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象 ...

  3. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 电商之14.0 Zookeeper 分布式锁实现原理

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁. 排他锁 排他锁(Exclusive Locks),又被称为写 ...

  4. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Git 远程仓库(Github)

    Git 远程仓库(Github) 推荐电商源码 Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. ...

  5. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Maven教程

    Maven 教程 推荐电商源码 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概 ...

  6. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Docker 架构

    Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统.比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16 ...

  7. springboot 定时器_基于SpringCloud?+?SpringBoot的 SaaS型微服务脚手架源码分享

    简介: 基于SpringCloud(Hoxton.SR3) + SpringBoot(2.2.6.RELEASE) 的 SaaS型微服务脚手架,具备用户管理.资源权限管理.网关统一鉴权.Xss防跨站攻 ...

  8. java版SpringCloud+SpringBoot+mybatis+uniapp b2b2c 多商户入驻商城 直播商城 直播带货商城之行业管理

    1. 涉及平台 平台管理.商家端(PC端.手机端).买家平台(H5/公众号.小程序.APP端(IOS/Android).微服务平台(业务服务) 2. 核心架构 Spring Cloud.Spring ...

  9. 七十七、java版商城之直播短视频带货Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

    一个好的SpringCloud+SpringBoot b2b2c 电子商务平台涉及哪些技术.运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管 ...

最新文章

  1. java与c/c++之间的数据交互-----jni点滴
  2. Go-技篇第一 技巧杂烩
  3. matlab 手掌轮廓,CG_图片轮廓mask提取-matlab
  4. jQuery的.bind()、.live()和.delegate()之间区别
  5. Zookeeper Api(java)入门与应用
  6. 自定义装点博客的“门面”
  7. OOAD 面向对象分析与设计
  8. 马尔科夫链和马尔科夫链蒙特卡洛方法
  9. 多线程实战(二)线程同步
  10. 在Ubuntu上使用FreeFileSync同步文件
  11. 中国象棋游戏设计与实现
  12. java 对session的基本使用
  13. 称重仪表显示ol怎么解决_称重仪表显示Erd和数字是怎么回事?
  14. Processing创意编程(熟练篇)
  15. OUC暑期培训(深度学习)——第一周学习记录:深度学习和pytorch基础
  16. HTTP协议中的1xx,2xx,3xx,4xx,5xx状态码分别表示什么,列举常见错误码及含义
  17. uniapp 调用 android 原生sdk
  18. 控制器模式_前控制器模式简介,第1部分
  19. Ctrix卸载ReceiverCleanupUtility.exe
  20. 苏州大学9月计算机考试试题,2016年9月计算机一级考试试题含答案

热门文章

  1. html js引入位置,JavaScript | 文件引入位置的讲究,在文件头部和尾部哪里引入JS文件更好?...
  2. VIM快速移动光标到行首行尾及特定行
  3. 计算机主板巨头,华硕/技嘉/微星三巨头近年主板业绩分析
  4. 基于Linux的智能家居的设计(1)
  5. 【怎样制作ppt课件】Focusky教程 | 在Focusky中如何进行多选?
  6. 金蝶K3销售订单与下游单据后台解耦
  7. js面向对象开发互联网机顶盒应用头端之六
  8. Android高仿新浪微博点赞动画
  9. 【乐绘派】Audition专业音频后期制作教程 | 5-自定义工作区
  10. python3 生成钻石展位后台报表记录