• java设计模式(七)适配器模式(Adapter Pattern)


    1、模式介绍:

            适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。

    2、应用场景:

             系统需要使用现有的类,而这些类的接口不符合需求。
            不想修改现有的接口,而又需要复用该接口的情况。
            多个类似功能的接口需要统一。

    3、优点:

            增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
            灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。

    4、缺点:

            过多使用适配器,会让系统非常零乱。
            增加系统的复杂性
    :因为增加了额外的适配器,可能会增加系统的理解难度

    5、代码实现:

    1. /**
    2. * 适配接口
    3. *
    4. * @author FM_南风
    5. * @date 2024/6/27 13:53
    6. */
    7. public interface MediaPlayer {
    8. void play(String mediaType, String fileName);
    9. }
    10. /**
    11. * 被适配者
    12. *
    13. * @author FM_南风
    14. * @date 2024/6/27 13:54
    15. */
    16. public class AudioPlayer implements MediaPlayer{
    17. @Override
    18. public void play(String mediaType, String fileName) {
    19. if (mediaType.equalsIgnoreCase("mp3")) {
    20. System.out.println("播放MP3文件: " + fileName);
    21. } else {
    22. System.out.println("使用" + mediaType + "媒体播放");
    23. }
    24. }
    25. }
    26. /**
    27. * 新适配接口
    28. *
    29. * @author FM_南风
    30. * @date 2024/6/27 13:55
    31. */
    32. public interface AdvancedMediaPlayer {
    33. void playVlc(String fileName);
    34. void playMp4(String fileName);
    35. }
    36. /**
    37. * Mp4播放器实现新的接口
    38. *
    39. * @author FM_南风
    40. * @date 2024/6/27 13:56
    41. */
    42. public class Mp4Player implements AdvancedMediaPlayer{
    43. @Override
    44. public void playVlc(String fileName) {
    45. }
    46. @Override
    47. public void playMp4(String fileName) {
    48. System.out.println("播放MP4文件: " + fileName);
    49. }
    50. }
    51. /**
    52. * Vlc播放器实现新的接口
    53. *
    54. * @author FM_南风
    55. * @date 2024/6/27 13:56
    56. */
    57. public class VlcPlayer implements AdvancedMediaPlayer {
    58. @Override
    59. public void playVlc(String fileName) {
    60. System.out.println("播放Vlc文件: " + fileName);
    61. }
    62. @Override
    63. public void playMp4(String fileName) {
    64. }
    65. }
    66. /**
    67. * 适配器类,实现目标接口并持有被适配者的引用
    68. *
    69. * @author FM_南风
    70. * @date 2024/6/27 13:57
    71. */
    72. public class MediaAdapter implements MediaPlayer{
    73. AdvancedMediaPlayer advancedMusicPlayer;
    74. public MediaAdapter(String mediaType) {
    75. if (mediaType.equalsIgnoreCase("vlc")) {
    76. advancedMusicPlayer = new VlcPlayer();
    77. } else if (mediaType.equalsIgnoreCase("mp4")) {
    78. advancedMusicPlayer = new Mp4Player();
    79. }
    80. }
    81. @Override
    82. public void play(String mediaType, String fileName) {
    83. if (mediaType.equalsIgnoreCase("vlc")) {
    84. advancedMusicPlayer.playVlc(fileName);
    85. } else if (mediaType.equalsIgnoreCase("mp4")) {
    86. advancedMusicPlayer.playMp4(fileName);
    87. }
    88. }
    89. }
    90. /**
    91. * 应用
    92. *
    93. * @author FM_南风
    94. * @date 2024/6/27 13:58
    95. */
    96. public class AdapterClient {
    97. public static void main(String[] args) {
    98. MediaPlayer audioPlayer = new AudioPlayer();
    99. audioPlayer.play("mp3", "音乐.mp3");
    100. audioPlayer.play("mp4", "视频.mp4");
    101. audioPlayer.play("vlc", "视频.vlc");
    102. audioPlayer.play("avi", "视频.avi"); // Unsupported media type
    103. }
    104. }

    6、结果展示:

  • 相关阅读:
    苹果全球销量超越小米重回第二,荣耀回归国内手机市场第一梯队
    信息系统项目管理师第四版学习笔记——项目绩效域
    【Leetcode】805. Split Array With Same Average
    基于python和定向爬虫的商品比价系统
    MySQl索引
    linux基础--磁盘管理
    [3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现、包含官网PV-RCNN预训练权重及报错问题
    【首阳首板之主升三域洗盘域】洞察洗盘突破典型形态,心中不慌
    APC12345
    是使用local_setup.bash 还是 setup.bash
  • 原文地址:https://blog.csdn.net/weixin_70044963/article/details/140011737