适配器模式

适配器模式

文章目录

什么是适配器模式

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一

起工作的那些类可以一起工作。

  • Target:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口
  • Adapter:通过在内部包装一个Adaptee对象,把源接口转换成目标接口
  • Adeptee:需要适配的类

示例

适配器模式是一种结构型设计模式,它允许将一个接口转换成客户希望的另一个接口,使原本因接口不兼容而不能一起工作的类能够协同工作。适配器模式包含以下角色:

  • Target(目标接口):客户期待的接口
  • Adaptee(被适配者):现有的、需要被适配的接口
  • Adapter(适配器):实现目标接口,并持有被适配者的实例,负责将被适配者的方法转换为目标接口的方法

下面是一个使用 Java 实现适配器模式的示例,假设有一个音频播放器(AudioPlayer)需要播放不同格式的音乐文件,但只能直接播放 MP3 文件。为了使其能够播放 WAV 和 OGG 格式的文件,我们需要创建适配器来将这两种格式转换为 MP3 格式。

1.首先,定义音频播放器期待的目标接口(Target):

java 复制代码
public interface AudioPlayer {
    void play(String fileName, String fileType);
}

2.接着,定义现有音频文件接口(Adaptees):

java 复制代码
public class MP3File {
    public void play() {
        System.out.println("Playing MP3 file...");
    }
}
java 复制代码
public class WAVFile {
    public void decodeAndPlay() {
        System.out.println("Decoding and playing WAV file...");
    }
}
java 复制代码
public class OGGFile {
    public void convertAndPlay() {
        System.out.println("Converting and playing OGG file...");
    }
}

3.然后,创建适配器类(Adapter),实现目标接口(AudioPlayer),并持有被适配者(WAVFile 和 OGGFile)的实例:

java 复制代码
public class WAVAdapter implements AudioPlayer {
    private WAVFile wavFile;

    public WAVAdapter(WAVFile wavFile) {
        this.wavFile = wavFile;
    }

    @Override
    public void play(String fileName, String fileType) {
        if ("wav".equals(fileType)) {
            wavFile.decodeAndPlay();
        } else {
            System.out.println("Unsupported file type for WAVAdapter.");
        }
    }
}
java 复制代码
public class OGGAdapter implements AudioPlayer {
    private OGGFile oggFile;

    public OGGAdapter(OGGFile oggFile) {
        this.oggFile = oggFile;
    }

    @Override
    public void play(String fileName, String fileType) {
        if ("ogg".equals(fileType)) {
            oggFile.convertAndPlay();
        } else {
            System.out.println("Unsupported file type for OGGAdapter.");
        }
    }
}

4.最后,创建音频播放器(AudioPlayer)并使用适配器播放不同格式的文件:

java 复制代码
public class Main {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer() {
            @Override
            public void play(String fileName, String fileType) {
                if ("mp3".equals(fileType)) {
                    new MP3File().play();
                } else if ("wav".equals(fileType)) {
                    new WAVAdapter(new WAVFile()).play(fileName, fileType);
                } else if ("ogg".equals(fileType)) {
                    new OGGAdapter(new OGGFile()).play(fileName, fileType);
                } else {
                    System.out.println("Unsupported file type.");
                }
            }
        };

        audioPlayer.play("song1.mp3", "mp3");
        audioPlayer.play("song2.wav", "wav");
        audioPlayer.play("song3.ogg", "ogg");
    }
}

在这个示例中,AudioPlayer 是目标接口,MP3File、WAVFile 和 OGGFile 是被适配者,WAVAdapter 和 OGGAdapter 是适配器。通过适配器,原本只能播放 MP3 文件的音频播放器现在也能播放 WAV 和 OGG 格式的文件,实现了不同接口之间的无缝对接。这就是适配器模式的应用。

相关推荐
MATLAB代码顾问4 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
ting94520004 小时前
Tornado 全栈技术深度指南:从原理到实战
人工智能·python·架构·tornado
果汁华4 小时前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi4 小时前
04-缩放点积注意力代码实现 💻
人工智能·python
DeepReinforce5 小时前
三、AI量化投资:使用akshare获取A股主板20260430所有的涨停股票
python·量化·akshare·龙头战法
段一凡-华北理工大学5 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人5 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒6 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼6 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ7 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring