适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
应用场景:读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
优点: 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 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。