网站推广.NET

网站推广.NET

Java设计模式之适配器模式的妙用

来源:互联网

适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如 mediaplayer)可以播放高级格式的媒体(如 vlc),尽管其本身仅支持普通媒体格式(如 mp3)。

Java 设计模式之适配器模式的妙用

简介

适配器模式是一种结构型设计模式,它允许一个对象与另一个具有不兼容接口的对象协同工作。换句话说,它将一个接口转换为另一个接口,使原本不兼容的两个对象能够顺利交互。

立即学习“Java免费学习笔记(深入)”;

结构

适配器模式的结构如下图所示:

                        +--------------------+                        |       Target       |                        +--------------------+                                 ^                                 |                        +--------------------+                        |    Adaptee(被适配) |                        +--------------------+                                 ^                                 |                  +----------------------------+                  |  Object Adapter (对象适配器)  |                  +----------------------------+                             |                 |                              \_______________/
  • Target (目标):定义客户端需要的接口。
  • Adaptee (被适配):定义要被适配的接口。
  • Adapter (适配器):将 Adaptee 接口转换为 Target 接口,从而使客户端能够使用 Adaptee。

对象适配器

对象适配器是一种实现适配器模式的简单方式。它创建了一个新的适配器对象,该对象将 Adaptee 对象包含在其中并实现 Target 接口。

// Target 接口interface Target {    int operation();}// Adaptee 接口interface Adaptee {    int specificOperation();}// Adapter (对象适配器)class Adapter implements Target {    private final Adaptee adaptee;    public Adapter(Adaptee adaptee) {        this.adaptee = adaptee;    }    @Override    public int operation() {        return adaptee.specificOperation();    }}

实战案例

假设我们有两个类:MediaPlayerAdvancedMediaPlayerMediaPlayer 类负责播放普通格式的媒体(如 MP3),而 AdvancedMediaPlayer 类负责播放高级格式的媒体(如 VLC)。我们要使用适配器模式来使 MediaPlayer 类能够播放高级格式的媒体。

class MediaPlayer {    public void playMP3(String filename) {        System.out.println("Playing MP3: " + filename);    }}class AdvancedMediaPlayer {    public void playVLC(String filename) {        System.out.println("Playing VLC: " + filename);    }}class MediaAdapter implements MediaPlayer {    private final AdvancedMediaPlayer advancedMediaPlayer;    public MediaAdapter(AdvancedMediaPlayer advancedMediaPlayer) {        this.advancedMediaPlayer = advancedMediaPlayer;    }    @Override    public void playMP3(String filename) {        advancedMediaPlayer.playVLC(filename);    }}// 客户调用MediaPlayer audioPlayer = new MediaAdapter(new AdvancedMediaPlayer());audioPlayer.playMP3("FileName.vlc");

输出:

Playing VLC: FileName.vlc

通过使用适配器模式,我们在不修改 MediaPlayer 类的源代码的情况下,扩展了它的功能,使其能够播放高级格式的媒体。

适配器模式