06-Java适配器模式 ( Adapter Pattern )

原型模式

    • 摘要
    • 实现
    • 范例

  • 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁

  • 适配器模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡

适配器模式属于结构型模式,它结合了两个独立接口的功能

摘要

1. 意图

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

2. 主要解决

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

3. 何时使用

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

4. 如何解决

继承或依赖(推荐)

5. 关键代码

  • 适配器继承或依赖已有的对象,实现想要的目标接口

6. 应用实例

  • 美国电器110V,中国220V,就要有一个适配器将110V转化为220V;
  • JAVAJDK1.1提供了Enumeration接口,而在1.2中提供了Iterator接口,想要使用1.2的JDK,则要将以前系统的Enumeration接口转化为Iterator接口,这时就需要适配器模式;
  • 在LINUX上运行WINDOWS程序;
  • JAVA中的jdbc;

7. 优点

  • 可以让任何两个没有关联的类一起运行;
  • 提高了类的复用;
  • 增加了类的透明度;
  • 灵活性好;

8. 缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握;
    比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难 因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构

  • 由于JAVA至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类;

9. 使用场景

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

10. 注意事项

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

实现

在这里插入图片描述

  1. MediaPlayer接口和一个实现了MediaPlayer接口的实体类AudioPlayer默认情况下,AudioPlayer可以播放mp3格式的音频文件;
  2. 接口AdvancedMediaPlayer和实现了AdvancedMediaPlayer接口的实体类该类可以播放vlc和mp4格式的文件;
  3. AudioPlayer播放其他格式的音频文件为了实现这个功能,我们需要创建一个实现了MediaPlayer接口的适配器类MediaAdapter,并使用AdvancedMediaPlayer对象来播放所需的格式;
  4. AudioPlayer使用适配器类MediaAdapter传递所需的音频类型,不需要知道能播放所需格式音频的实际类;
  5. AdapterPatternDemo使用AudioPlayer类来播放各种格式;

范例

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

MediaPlayer.java

package com.demo.gof;
public interface MediaPlayer {public void play(String audioType, String fileName);
}

AdvancedMediaPlayer.java

package com.demo.gof;
public interface AdvancedMediaPlayer {  public void playVlc(String fileName);public void playMp4(String fileName);
}

2. 创建实现了 AdvancedMediaPlayer 接口的实体类

VlcPlayer.java

package com.demo.gof;
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

package com.demo.gof;
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

package com.demo.gof;
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

package com.demo.gof;
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

package com.demo.gof;
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");}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/AdapterPatternDemo.java
$ java  com.demo.gof.AdapterPatternDemo
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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时,ETM professional control采取了前瞻性的措施,选择了业界领先的威步CodeMeter技术,以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视,也标志着其在保障关键基础设施运营…

Python学习笔记(水桶谜题代码学习)——应用*符号解包列表所有元素传递给函数用法

原文:http://inventwithpython.com/bigbookpython/project81.html 在这个小游戏中,有三个水桶,容量分别是3升、5升和8升,需要在其中一个水桶中收集正好四升水。规则是: 1、桶只能被清空、完全装满或倒入另一个桶中。…

《大魔界村》中的人物性格——亚瑟

《大魔界村》作为一款经典的街机动作游戏,其主角——勇敢的骑士亚瑟,以其独特的性格特点和坚定的信念,在玩家心中留下了深刻印象。本文将深入探讨亚瑟这一角色的性格特质,通过分析他在游戏中的行为表现及决策过程,展现他身上的勇气、坚韧与智慧三大要点。 一、无畏挑战的…

如何配置SSH实现无公网ip远程连接访问Deepin操作系统

📑前言 本文主要是配置SSH实现无公网ip远程连接访问Deepin操作系统的文章,如果有什么需要改进的地方还请大佬指出⛺️** 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &…

fastapi 链接数据库,并报错问题

还有一个重点需要下载 pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simplefrom fastapi import FastAPI import uvicorn from student.urls import student_id_mysql from sqlalchemy …

go使用gopprof分析内存泄露

假设我们使用的是比如beego这样的网络框架,我们可以这样加代码来使用gopprof来进行内存泄露分析: beego框架加gopprof分析代码: 1.先在router.go里添加路由信息: beego.Router("/debug/pprof", &controllers.ProfController{}) beego.Router("/debug…

【Linux】文件周边002之初步理解文件管理(打开的文件)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.(打开…

leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示…

XGB-3: 模型IO

在XGBoost 1.0.0中,引入了对使用JSON保存/加载XGBoost模型和相关超参数的支持,旨在用一个可以轻松重用的开放格式取代旧的二进制内部格式。后来在XGBoost 1.6.0中,还添加了对通用二进制JSON的额外支持,作为更高效的模型IO的优化。…

lua只读表

参考《programming in lua》13.4.5中,详细介绍了只读表的用法。建立一个函数,传入一个table,传出一个代理table,其__index指向传入的table,__newIndex直接报error即可: --输入一个table,输出一…

蓝桥杯(Web大学组)2023十四届省赛真题3:收集帛书碎片

需要实现: 1.将二维数组转为一维数组; 2.数组去重 一、将二维数组转为一维数组: 二、数组去重: function collectPuzzle(...puzzles) {// console.log(puzzles);// console.log(...puzzles);// TODO:在这里写入具体的实现逻辑/…

monaco-editor布局篇(一)-自适应大小

编辑器的宽高怎么进行自适应? 在create编辑时,通过配置 automaticLayout 实现编辑器大小自适应: monaco.editor.create(editorRef.value, {value: ,language: "javascript",fixedOverflowWidgets: true,fontFamily: "Arial&q…

可控概率抽奖算法

说明 本文PHP语言去实现,只实现核心可控概率引擎,库存判断等其它业务需要其它代码配合实现。 代码 /*** function 封装可控概率的抽奖功能* param $arr array 数据集合* param $weight_key string 权重字段* return array 被选…

colavoidance4

共有四个Matlab文件,main.m、AirCraft.m、Arena.m和mission_planner.m main.m 主文件比较简短,主要是模拟和控制无人机的飞行路径。 首先是一些初始定义和设置: num_of_UAVs 4: 定义无人机的数量为4。time 1300: 定义总时间为1300秒。s…

【算法分析与设计】无重复的最长子串

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

九州金榜|如何做好家庭教育

孩子的家庭教育是每个家庭都要做的,也是每个家长面临的事情,同样不同的家庭教育教育出来的孩子性格也各不相同,有时候家长看别别人家的孩子品学兼优非常羡慕,很多家长会把问题归结到孩子身上,其实有没有想过是家庭教育…

机器学习算法与Python实战 | 2024年吴恩达预测:关于AI,这些事未来十年不会变

本文来源公众号“机器学习算法与Python实战”,仅用于学术分享,侵权删,干货满满。 原文链接:2024年吴恩达预测:关于AI,这些事未来十年不会变 2024年,AI的发展会有怎样的改变? 在吴…

CSDN文章导出工具

源码地址: github:https://github.com/lishuangquan1987/CSDNExportergitee:https://gitee.com/lishuangquan1987/csdnexporter 介绍 最近有CSDN博客导出来的需求,翻看了很多开源工具,都不能用或者不好用,于是决定自己做一个。…

docker swarm

1.准备三台机器,分别安装docker,例如IP分别为: 192.168.88.131,192.168.88.136,192.168.88.138 2.修改/etc/hostname 分别为: manger,node1,node2 3.分别修改/etc/hosts添加: 192.168.88.131 manger 192.168.88.13…

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型,功能虽然很强大,但对语言的支持和扩展比较差,例如,二者都是以英语为主的大模型。 为了提升大模型语言的多元化,慕尼黑大学、赫尔辛基大学等研究人员联合开源了,…