适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
应用场景:读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
下面举例 说明:
- namespace 适配器模式
- {
- internal class Program
- {
- static void Main(string[] args)
- {
- AudioBusiness audioBusiness = new AudioBusiness();
- audioBusiness.Play("mp3", "d:/1.mp3");
- audioBusiness.Play("mp4", "d:/1.mp4");
- audioBusiness.Play("vcl", "d:/1.vcl");
- audioBusiness.Play("aiv", "d:/1.vcl");
- /*
- * 控制台输出
- * MP3Playerr播放了d:/1.mp3文件
- Mp4Player播放了d:/1.mp4文件
- CrossPlatformPlayer播放了d:/1.vcl文件
- 不支持aiv格式的文件
- */
- }
- }
- //原本业务 只支持 播放 MP3 音频
- public interface MP3Player
- {
- void Play(string playType ,string fileName);
- }
- //新业务 需要 支持 vcl和mp4播放
- public interface NewPlayer
- {
- void CrossPlatformPlayer(string fileName);
- void Mp4Player(string fileName);
- }
- //实现 新业务
- public class CrossPlatformPlayer : NewPlayer
- {
- public void Mp4Player(string fileName)
- {
- //实体类为 CrossPlatformPlayer 所以Mp4Player 不写内容
- }
-
- void NewPlayer.CrossPlatformPlayer(string fileName)
- {
- Console.WriteLine("CrossPlatformPlayer播放了"+ fileName+"文件");
- }
- }
- //实现 新业务
- public class Mp4Player : NewPlayer
- {
- public void CrossPlatformPlayer(string fileName)
- {
- //实体类为 Mp4Player 所以CrossPlatformPlayer不写内容
- }
-
- void NewPlayer.Mp4Player(string fileName)
- {
- Console.WriteLine("Mp4Player播放了" + fileName + "文件");
- }
- }
- //添加 一个 适配器类 融合 两个 业务
- public class AudioAdapter : MP3Player
- {
- private NewPlayer newPlayer;
- public AudioAdapter(string playType)
- {
- if (playType == "vcl")
- {
- newPlayer = new CrossPlatformPlayer();
- } else if (playType == "mp4")
- {
- newPlayer = new Mp4Player();
- }
- }
- public void Play(string playType, string fileName)
- {
- if (playType == "vcl")
- {
- newPlayer.CrossPlatformPlayer(fileName);
- }
- else if (playType == "mp4")
- {
- newPlayer.Mp4Player(fileName);
- }
- }
- }
- //原本业务只支持 MP3的业务,现在 开始使用 适配器模式 融合在一起
- public class AudioBusiness : MP3Player
- {
- private AudioAdapter audioAdapter;
- public void Play(string playType, string fileName)
- {
- if(playType == "mp3")
- {
- Console.WriteLine("MP3Playerr播放了" + fileName + "文件");
- }else if (playType == "mp4" || playType == "vcl")
- {
- audioAdapter = new AudioAdapter(playType);
- audioAdapter.Play(playType, fileName);
- }
- else
- {
- Console.WriteLine("不支持"+ playType+ "格式的文件");
- }
- }
- }
- }
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。