c# 适配器模式


在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`代码的情况下,使其能够播放新格式的音频。