在C#中,适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期待的另一个接口形式,从而使得原本因接口不兼容而不能一起工作的类可以一起工作。
这里提供一个简单的适配器模式示例,假设我们有一个旧的系统,它有一个`OldMediaPlayer`类,这个类只能播放MP3格式的音乐。现在,我们有一个新的音频格式`AdvancedAudioFormat`,但我们希望在不修改`OldMediaPlayer`类的情况下,能够使用它来播放`AdvancedAudioFormat`格式的音乐。
我们可以创建一个适配器类`AudioPlayerAdapter`,它接收`AdvancedAudioFormat`对象,并将其转换为`OldMediaPlayer`可以理解的`MP3`格式(这里假设是转换逻辑是模拟的,实际上可能需要某种形式的解码和编码过程)。
// 旧的音乐播放器类,只能播放MP3
public class OldMediaPlayer
{
public void Play(string audioType, string fileName)
{
if (audioType.ToLower() == "mp3")
{
Console.WriteLine($"Playing {fileName} (MP3 format) in old media player");
}
else
{
Console.WriteLine("Invalid media. MP3 format required.");
}
}
}
// 新的音频格式
public class AdvancedAudioFormat
{
public string FileName { get; set; }
// 这里假设有方法来获取音频内容,但为了简化,我们直接使用文件名
}
// 适配器类
public class AudioPlayerAdapter
{
private OldMediaPlayer mediaPlayer;
public AudioPlayerAdapter(OldMediaPlayer mediaPlayer)
{
this.mediaPlayer = mediaPlayer;
}
// 转换方法,将AdvancedAudioFormat转换为OldMediaPlayer可识别的格式
public void Play(AdvancedAudioFormat advancedAudio)
{
// 在这里,我们模拟转换过程,实际上可能需要复杂的解码和编码
string fileName = advancedAudio.FileName; // 假设文件名就是处理后的“MP3”格式文件名
mediaPlayer.Play("mp3", fileName);
}
}
// 客户端代码
class Program
{
static void Main(string[] args)
{
OldMediaPlayer oldPlayer = new OldMediaPlayer();
AudioPlayerAdapter adapter = new AudioPlayerAdapter(oldPlayer);
AdvancedAudioFormat newFormat = new AdvancedAudioFormat { FileName = "example.aac" }; // 假设这是AAC格式的文件
// 使用适配器播放新格式的音频
adapter.Play(newFormat);
}
}
在这个示例中,`AudioPlayerAdapter`类作为适配器,接收`AdvancedAudioFormat`对象,并调用`OldMediaPlayer`的`Play`方法来播放音乐。尽管`OldMediaPlayer`本身不支持`AdvancedAudioFormat`格式,但通过适配器模式,我们能够在不修改`OldMediaPlayer`代码的情况下,使其能够播放新格式的音频。