Adapter模式(适配器模式)

Adapter模式简介

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。将一个类的接口转换成客户希望的另一个接口。使得原本由于接口不兼容而不能一起工作的类可以一起工作。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

举个栗子:现在手机充电接口开始向Type-C转变,但是市面上大多数充电线还是传统的接口,如果你有没有针对性的Type-C充电线,怎么办呐,答案是显而易见的用转接头,转换接口,从而可以利用传统数据线为Type-C接口的手机充电。

适配器模式就是利用这个单一的类,充当转接头的作用,让其他的类,能够适配我们新的要求,而不用为了这个新标准而重构大量代码。

结构与分类

Adapeter模式主要有两种类型 对象Adapter模式类Adapter模式

1.对象Adapter模式

Adapter模式(适配器模式)

如右图所示,这种结构依赖于一个对象(适配对象)包含另外的一个对象(被适配的对象),就好比UML图中展示的那样,在派生类Adapter中引用Adaptee(被适配对象),调用其中的相关函数,实现接口与结构的统一。

2.类Adapter模式:

这种结构的通过多继承的方式来实现的,一般从定义其接口的抽象类公开继承,从访问其实现的原有类私有继承具体可参照下图

 

Adapter模式(适配器模式)

具体实现

音频播放器的扩展

1)我们有一个 IAudioPlayer 接口和一个实现了 IAudioPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
2)我们还有另一个接口 IAdvancedMediaPlayer 和实现了 IAdvancedMediaPlayer 接口的实体类。该类可以播放 wav 和 ape 格式的高级音频文件。
3)我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 IAudioPlayer 接口的适配器类 AudioAdapter,并使用 IAdvancedMediaPlayer 对象来播放所需的格式。
4)AudioPlayer 使用适配器类 AudioAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。Adapter Pattern,我们的演示类使用 AudioPlayer 类来播放各种格式。

具体UML类图如下

直接在VS2015的建模项目里画的,方便我直接生成部分代码,与标准UML图可能有差异

Adapter模式(适配器模式)

Step1:为音频播放器和更高级的音频播放器创建接口。

IAudioPlayre.cs

IAdvanceAudioPlayer.cs

Step2:创建实现了 IAdvancedMediaPlayer 接口的实体类。

WavPlayer.cs

ApePlayer.cs

Step3:创建实现了 AduioPlayer 接口的适配器类。

AudioAdapter.cs

Step4:创建实现了 AudioPlayer 接口的基本音频格式播放的实体类。

AudioPlayer.cs

Step5:一个驱动类利用AudioPlayer 来播放不同格式的音频文件。

AdapterPattern.cs

输出结果

GitHub

以上具体实现代码已提交至git(C#实现):Adapter Patterm代码仓库地址(clicked here!)

繁夜

发表评论


头像速览

:[傲慢]::[白眼]::[鄙视]::[擦汗]::[呲牙]::[大兵]::[得意]::[发呆]::[发怒]::[奋斗]::[鼓掌]::[哈欠]::[憨笑]::[坏笑]::[惊讶]::[可爱]::[可怜]::[酷]::[困]::[冷汗]::[流汗]::[流泪]::[难过]::[撇嘴]::[敲打]::[色]::[衰]::[偷笑]::[微笑]::[吓]::[疑问]::[阴险]::[晕]::[咒骂]::[菜刀]::[玫瑰]::[凋谢]::[礼物]::[拥抱]::[炸弹]::[强]::[弱]::[握手]: