在 C# 中,适配器模式(Adapter Pattern)是一种结构型设计模式,旨在将一个类的接口转换成客户端所期待的另一个接口。适配器模式允许你将现有的类包装起来,使其能够与其他接口兼容。
适配器模式的使用场景:
- 当你希望将一个类的接口与另一个接口对接,而不希望修改现有代码时。
- 你希望在使用一些类时,它们具有一致的接口,但实际实现不同。
适配器模式的结构:
- Target:定义客户端所期待的接口。
- Adapter:将被适配的类转换为客户端所期待的接口。
- Adaptee:需要适配的类,通常是已经实现的功能类。
- Client:与
Target
交互的类。
例子:将一个老的 MediaPlayer
类与新的 AdvancedMediaPlayer
类兼容
步骤 1: 定义接口(Target)
// Target: 定义客户端所期待的接口
public interface IMediaPlayer
{void Play(string fileName);
}
步骤 2: 定义被适配的接口(Adaptee)
// Adaptee: 一个旧的播放器,只有播放 MP4 文件的功能
public class MediaAdapter : IMediaPlayer
{private readonly IAdvancedMediaPlayer _advancedMusicPlayer;public MediaAdapter(IAdvancedMediaPlayer advancedMusicPlayer){_advancedMusicPlayer = advancedMusicPlayer;}public void Play(string fileName){if (fileName.EndsWith(".mp4")){_advancedMusicPlayer.PlayMp4(fileName);}}
}public interface IAdvancedMediaPlayer
{void PlayMp4(string fileName);void PlayVlc(string fileName);
}public class AdvancedMusicPlayer : IAdvancedMediaPlayer
{public void PlayMp4(string fileName){Console.WriteLine("Playing mp4 file: " + fileName);}public void PlayVlc(string fileName){Console.WriteLine("Playing vlc file: " + fileName);}
}
步骤 3: 创建适配器类(Adapter)
// Adapter: 适配器将旧播放器与新播放器接口连接起来
public class AudioPlayer : IMediaPlayer
{private readonly MediaAdapter _mediaAdapter;public AudioPlayer(){// 适配器可以处理 MP4 格式_mediaAdapter = new MediaAdapter(new AdvancedMusicPlayer());}public void Play(string fileName){if (fileName.EndsWith(".mp4")){_mediaAdapter.Play(fileName);}else{Console.WriteLine("Invalid format or not supported: " + fileName);}}
}
步骤 4: 客户端代码(Client)
class Program
{static void Main(string[] args){IMediaPlayer player = new AudioPlayer();player.Play("song1.mp4"); // 输出: Playing mp4 file: song1.mp4player.Play("song2.avi"); // 输出: Invalid format or not supported: song2.avi}
}
适配器模式的工作原理:
AudioPlayer
类是客户端,它期望使用一个统一的接口IMediaPlayer
来播放文件。AdvancedMusicPlayer
类有两个专门的方法来播放mp4
和vlc
文件,但它并不直接符合IMediaPlayer
接口。MediaAdapter
类充当适配器,将AdvancedMusicPlayer
的接口适配到IMediaPlayer
接口,使得AudioPlayer
可以直接调用IMediaPlayer
接口,而不需要关心实际的播放器实现。
总结:
适配器模式使得你可以在不改变现有代码的情况下,增加对新接口的支持。通过适配器类来桥接客户端代码与需要适配的类,从而实现接口的兼容性。