编程-设计模式 6:适配器模式

设计模式 6:适配器模式

定义与目的
  • 定义:适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 目的:该模式的主要目的是解决接口不匹配的问题,使得一个已经存在的类可以被新的环境所接受。
实现示例

假设我们有一个老版本的音频播放器,它只能播放 MP3 格式的文件,但现在我们需要它也能播放 WAV 格式的文件。我们可以使用适配器模式来解决这个问题。

java 复制代码
// 定义目标接口
public interface AudioPlayer {
    void play(String audioType, String fileName);
}

// 定义已有的MP3播放器类
public class Mp3Player implements AudioPlayer {
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else {
            System.out.println("Invalid audio format");
        }
    }
}

// 定义WAV文件接口
public interface AdvancedAudioPlayer {
    void playWav(String fileName);
}

// 定义WAV播放器类
public class WavePlayer implements AdvancedAudioPlayer {
    @Override
    public void playWav(String fileName) {
        System.out.println("Playing wav file. Name: " + fileName);
    }
}

// 定义适配器类
public class AudioAdapter implements AudioPlayer {
    private AdvancedAudioPlayer advancedAudioPlayer;

    public AudioAdapter(AdvancedAudioPlayer advancedAudioPlayer) {
        this.advancedAudioPlayer = advancedAudioPlayer;
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("wav")) {
            advancedAudioPlayer.playWav(fileName);
        } else {
            System.out.println("Invalid audio format");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new Mp3Player();
        audioPlayer.play("mp3", "beyond_the_river.mp3");

        AdvancedAudioPlayer wavePlayer = new WavePlayer();
        AudioPlayer audioAdapter = new AudioAdapter(wavePlayer);
        audioAdapter.play("wav", "beyond_the_river.wav");
    }
}
使用场景
  • 当你需要重用一些已有的类,但它们的接口与你的系统不兼容时。
  • 当你想创建一个可以复用的类,该类可以与其他无关的类或不可预见的类(即那些接口不兼容的类)协同工作时。

适配器模式通过包装一个已有的类来实现一个新的接口,从而解决了接口不兼容的问题。这使得原本不兼容的类可以协同工作,提高了系统的灵活性。

小结

适配器模式是一种常用的结构型模式,它可以帮助你解决接口不兼容的问题,使得现有类可以适应新的环境。通过使用适配器模式,你可以轻松地将已有的类集成到新的系统中,而不需要修改它们的源代码。

相关推荐
Tang10244 分钟前
分析 Android Jetpack Lifecycle 的设计思想及其与生命周期感知组件的交互原理
设计模式
?abc!16 分钟前
设计模式基础概念(结构型模式):适配器模式(Adapter Pattern)
python·设计模式·适配器模式
ApeAssistant1 小时前
Spring + 设计模式 (十八) 行为型 - 责任链模式
spring·设计模式
前端大白话2 小时前
震惊!90%前端工程师都踩过的坑!Vue中`$el`和`$refs`获取DOM元素的10大区别与实战指南
前端·vue.js·设计模式
前端大白话2 小时前
惊!10行代码实现fetch并发请求!前端工程师必看的错误处理神操作
前端·javascript·设计模式
ApeAssistant2 小时前
Spring + 设计模式 (十六) 行为型 - 状态模式
spring·设计模式
ApeAssistant2 小时前
Spring + 设计模式 (十五) 行为型 - 模板方法模式
spring·设计模式
lybugproducer6 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
cooldream200919 小时前
深入理解MVP架构:让UI层与业务逻辑完美分离的设计模式
ui·设计模式·架构·系统架构师
摘星编程1 天前
并发设计模式实战系列(3):工作队列
设计模式·并发编程