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


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

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

    优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

    下面举例 说明:

    1. namespace 适配器模式
    2. {
    3. internal class Program
    4. {
    5. static void Main(string[] args)
    6. {
    7. AudioBusiness audioBusiness = new AudioBusiness();
    8. audioBusiness.Play("mp3", "d:/1.mp3");
    9. audioBusiness.Play("mp4", "d:/1.mp4");
    10. audioBusiness.Play("vcl", "d:/1.vcl");
    11. audioBusiness.Play("aiv", "d:/1.vcl");
    12. /*
    13. * 控制台输出
    14. * MP3Playerr播放了d:/1.mp3文件
    15. Mp4Player播放了d:/1.mp4文件
    16. CrossPlatformPlayer播放了d:/1.vcl文件
    17. 不支持aiv格式的文件
    18. */
    19. }
    20. }
    21. //原本业务 只支持 播放 MP3 音频
    22. public interface MP3Player
    23. {
    24. void Play(string playType ,string fileName);
    25. }
    26. //新业务 需要 支持 vcl和mp4播放
    27. public interface NewPlayer
    28. {
    29. void CrossPlatformPlayer(string fileName);
    30. void Mp4Player(string fileName);
    31. }
    32. //实现 新业务
    33. public class CrossPlatformPlayer : NewPlayer
    34. {
    35. public void Mp4Player(string fileName)
    36. {
    37. //实体类为 CrossPlatformPlayer 所以Mp4Player 不写内容
    38. }
    39. void NewPlayer.CrossPlatformPlayer(string fileName)
    40. {
    41. Console.WriteLine("CrossPlatformPlayer播放了"+ fileName+"文件");
    42. }
    43. }
    44. //实现 新业务
    45. public class Mp4Player : NewPlayer
    46. {
    47. public void CrossPlatformPlayer(string fileName)
    48. {
    49. //实体类为 Mp4Player 所以CrossPlatformPlayer不写内容
    50. }
    51. void NewPlayer.Mp4Player(string fileName)
    52. {
    53. Console.WriteLine("Mp4Player播放了" + fileName + "文件");
    54. }
    55. }
    56. //添加 一个 适配器类 融合 两个 业务
    57. public class AudioAdapter : MP3Player
    58. {
    59. private NewPlayer newPlayer;
    60. public AudioAdapter(string playType)
    61. {
    62. if (playType == "vcl")
    63. {
    64. newPlayer = new CrossPlatformPlayer();
    65. } else if (playType == "mp4")
    66. {
    67. newPlayer = new Mp4Player();
    68. }
    69. }
    70. public void Play(string playType, string fileName)
    71. {
    72. if (playType == "vcl")
    73. {
    74. newPlayer.CrossPlatformPlayer(fileName);
    75. }
    76. else if (playType == "mp4")
    77. {
    78. newPlayer.Mp4Player(fileName);
    79. }
    80. }
    81. }
    82. //原本业务只支持 MP3的业务,现在 开始使用 适配器模式 融合在一起
    83. public class AudioBusiness : MP3Player
    84. {
    85. private AudioAdapter audioAdapter;
    86. public void Play(string playType, string fileName)
    87. {
    88. if(playType == "mp3")
    89. {
    90. Console.WriteLine("MP3Playerr播放了" + fileName + "文件");
    91. }else if (playType == "mp4" || playType == "vcl")
    92. {
    93. audioAdapter = new AudioAdapter(playType);
    94. audioAdapter.Play(playType, fileName);
    95. }
    96. else
    97. {
    98. Console.WriteLine("不支持"+ playType+ "格式的文件");
    99. }
    100. }
    101. }
    102. }

    缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

  • 相关阅读:
    Android中Gradle的使用
    网络代理技术:隐私保护与安全加固的利器
    STM32收入高也好找工作,所以我学嵌入式linux终究是错付了吗
    【脚本工具】SVG路径中的A指令转DXF的圆弧和椭圆弧 & C++代码实现
    【Android知识笔记】UI体系(四)
    Java集合框架【二容器(Collection)[ArrayList]】
    java计算机毕业设计交通非现场执法系统源码+mysql数据库+系统+lw文档+部署
    洛谷P3130 Counting Haybale P
    知识库指南4.0|AIGC & Web3 & 元宇宙发展趋势的学习与实践指引
    Java对象转换最佳方案
  • 原文地址:https://blog.csdn.net/q8812345qaz/article/details/127589107