C# 设计模式 结构型模式 之 适配器模式

适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

应用场景:读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

优点: 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 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

猜你喜欢

转载自blog.csdn.net/q8812345qaz/article/details/127589107