设计模式学习笔记 --- 6.适配器模式

2024-08-23 05:38

本文主要是介绍设计模式学习笔记 --- 6.适配器模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 这种模式涉及到一个单一类,该类负责加入独立或者不兼容的接口功能;例如读卡器是作为内存卡和笔记本之间的适配器。

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

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

  • 何时使用:

    • 1.系统需要使用现有的类,而此类的接口不符合系统的需求;

    • 2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关系的类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口;

    • 3.通过接口转化,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口)

  • 如何解决:

    • 继承;

    • 依赖(推荐);

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

  • 应用实例:

    • 1.美国电气110V,中国220V,就要有一个适配器将110V转化为220V;

    • 2.Java JDK1.1提供了Enumeration接口,而在1.2中提供了Iterator接口,想要使用1.2的JDK,则要将以前系统的Enumeration接口转化为Iterator接口,这是就需要适配器模式;

    • 3.在Linux上运行WINDOWS程序;

    • 4.Java中的JDBC;

  • 优点:

    • 1.可以让任何两个关联的类仪器运行;

    • 2.提高了泪的复用;

    • 3.增加了累的透明度;

    • 4.灵活性好;

  • 缺点:

    • 1.过多的使用适配器,会让系统非常凌乱,不以整体进行把握;

    • 2.明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难;

    • 3.因为如果不是很有必要,可以不适用适配器,而是直接对系统进行重构;

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

  • 使用场景:

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

  • 注意事项:

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

  • 实战:

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

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

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

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

    • AdapterPatternDemo,我们的演示类使用AudioPlayer类来播放各种格式;

 

package adapter;/*** @author yangxin_ryan*/
public interface MediaPlayer {public void play(String audioType, String fileName);}
package adapter;/*** @author yangxin_ryan*/
public interface AdvancedMediaPlayer {public void playVlc(String fileName);public void playMp4(String fileName);
}
package adapter;/*** @author yangxin_ryan*/
public class VlcPlayer implements AdvancedMediaPlayer {public void playVlc(String fileName) {System.out.println("Playing vlc file. Name: " + fileName);}public void playMp4(String fileName) {//}
}
package adapter;/*** @author yangxin_ryan */
public class Mp4Player implements AdvancedMediaPlayer {public void playVlc(String fileName) {//}public void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: " + fileName);}
}
package adapter;/*** @author yangxin_ryan */
public class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer = new Mp4Player();}}public void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer.playMp4(fileName);}}
}
package adapter;/*** @author yangxin_ryan*/
public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter;public void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file. Name: " + fileName);} else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);} else {System.out.println("Invalid meaid. " + audioType + " format not supported");}}
}
package adapter;/*** @author yangxin_ryan*/
public class AdpaterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "byond the borizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}

 

这篇关于设计模式学习笔记 --- 6.适配器模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098502

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个