• Java设计模式之适配器模式


    适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许原本不兼容的类能够合作无间。

    在软件开发中,适配器模式经常用于以下情况:

    1. 当需要使用一个已经存在的类,但其接口与需求不匹配时。
    2. 当需要创建一个可复用的类,该类与一些不兼容的接口协作。

    适配器模式包含以下几个角色:

    1. 目标接口(Target Interface):客户端所期望的接口,适配器将目标接口转换为适配者接口。
    2. 适配者(Adaptee):需要被适配的类或接口。
    3. 适配器(Adapter):实现目标接口,并持有适配者对象,将目标接口的方法调用转发给适配者对象。

    下面是一个简单的示例,展示适配器模式的使用:

    // 目标接口
    interface MediaPlayer {
        void play(String audioType, String fileName);
    }
    
    // 适配者接口
    interface AdvancedMediaPlayer {
        void playVlc(String fileName);
        void playMp4(String fileName);
    }
    
    // 适配者实现类
    class VlcPlayer implements AdvancedMediaPlayer {
        @Override
        public void playVlc(String fileName) {
            System.out.println("Playing vlc file: " + fileName);
        }
    
        @Override
        public void playMp4(String fileName) {
            // 什么也不做
        }
    }
    
    class Mp4Player implements AdvancedMediaPlayer {
        @Override
        public void playVlc(String fileName) {
            // 什么也不做
        }
    
        @Override
        public void playMp4(String fileName) {
            System.out.println("Playing mp4 file: " + fileName);
        }
    }
    
    // 适配器类
    class MediaAdapter implements MediaPlayer {
        private AdvancedMediaPlayer advancedMediaPlayer;
    
        public MediaAdapter(String audioType) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMediaPlayer = new VlcPlayer();
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMediaPlayer = new Mp4Player();
            }
        }
    
        @Override
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMediaPlayer.playVlc(fileName);
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMediaPlayer.playMp4(fileName);
            }
        }
    }
    
    // 客户端代码
    public class Main {
        public static void main(String[] args) {
            MediaPlayer mediaPlayer = new MediaAdapter("mp4");
            mediaPlayer.play("mp4", "movie.mp4");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    在上面的示例中,我们有一个目标接口 MediaPlayer,定义了播放音频的方法 play。然后我们有两个适配者接口 AdvancedMediaPlayer,分别用于播放 vlcmp4 格式的音频。适配器类 MediaAdapter 实现了目标接口,并持有适配者对象,将目标接口的方法调用转发给适配者对象。

    客户端代码中,我们创建了一个适配器对象 MediaAdapter,并调用了 play 方法来播放 mp4 格式的音频。适配器内部会将该调用转发给适配者对象 Mp4Player,从而实现了适配器模式的适配功能。

    适配器模式使得原本不兼容的类能够协同工作,提高了代码的复用性和灵活性。

  • 相关阅读:
    面向过程与面向对象、面向对象三大特性的介绍和示例
    vsCode 【 open in server】让局域网的其他人查看自己的文件
    学习笔记 --- RabbitMQ
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-18-处理鼠标拖拽-上篇
    RocketMq源码分析(二)--nameServer启动流程
    负载均衡技术全景:理论、实践与案例研究
    Uboot启动分析
    【leetcode】【初级算法】【数学3】3的幂
    使用WordPress搭建一个专属自己的博客
    11111111
  • 原文地址:https://blog.csdn.net/kkwyting/article/details/133702304