Java设计模式——适配器模式

⚪适配器模式(Adapter)是一种结构型设计模式。

⚪意图:将一个类的接口转换成另一个类的接口,以满足客户端的需求。它允许不同接口的类能够一起工作。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

  1. 目标接口(Target):客户端需要的接口,适配器模式的目标是使客户端能够使用这个接口。
  2. 适配器类(Adapter):实现了目标接口,并包含了要被适配的类的实例,它充当了连接目标接口和被适配接口的桥梁。
  3. 被适配的类(Adaptee):需要被适配以满足目标接口的类。

        ▷ 工作流程

  1. 客户端通过目标接口与适配器进行交互。
  2. 适配器内部持有被适配的类的实例。
  3. 当客户端调用目标接口的方法时,适配器将请求委派给被适配的类的相应方法,完成适配。

        ▷ 示例

// 目标接口
interface MediaPlayer {
    void play(String audioType, String fileName);
}

// 被适配的类
class Mp3Player implements MediaPlayer {
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing MP3 file: " + fileName);
        }
    }
}

// 适配器类
class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        } else if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        } else if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(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);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        MediaPlayer mediaPlayer = new MediaAdapter("mp4");
        mediaPlayer.play("mp4", "movie.mp4");

        mediaPlayer = new MediaAdapter("vlc");
        mediaPlayer.play("vlc", "video.vlc");

        mediaPlayer = new MediaAdapter("mp3");
        mediaPlayer.play("mp3", "audio.mp3");
    }
}

⚪适用性

  1. 想使用一个已经存在的类,而它的接口不符合要求。
  2. 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  3. (仅适用于对象 Adapter )想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

⚪应用场景

  1. 接口不兼容:当现有的类的接口与系统的要求不兼容时,适配器模式可以帮助将这些类集成到系统中。
  2. 旧系统和新系统集成:当需要将旧系统的功能集成到新系统中,但旧系统的接口与新系统不兼容时,适配器模式可以用来使二者协同工作。
  3. 第三方库或组件的集成:当你需要使用第三方库或组件,但它们的接口与你的应用程序不匹配时,适配器可以将这些库或组件集成到你的应用程序中。

⚪实际已有场景

  1. I/O流:Java中的InputStream和OutputStream类是一个很好的适配器模式的例子。它们提供了一个通用的接口来读写不同类型的数据源,如文件、网络连接等。
  2. Swing GUI编程:Swing GUI库中经常使用适配器模式来处理事件处理。例如,ActionListener接口用于处理按钮点击事件,但是可以使用适配器类ActionAdapter来实现它,以便只覆盖你感兴趣的事件处理方法。
  3. Spring AOP:在Spring框架中,AOP(面向切面编程)允许你通过创建切面(包含通知和切点)来在应用程序中添加横切关注点。通知是实际行为,但是在Spring中,通知的类型和触发点之间的关系需要使用适配器来实现。
  4. Spring MVC:Spring MVC控制器通常接受HTTP请求,并将其转换为方法调用。这是通过处理器适配器(HandlerAdapter)实现的,它将HTTP请求适配为控制器可以处理的形式。
  5. Spring消息队列:Spring框架支持与各种消息队列系统(如RabbitMQ、Kafka)的集成。适配器用于将Spring应用程序的消息发送和接收与特定消息队列系统的API适配。
posted @ 2023-10-03 23:50  xiaogh  阅读(160)  评论(0)    收藏  举报