You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我实现的适配器设计模式是否正确?若有误需补充或修改哪些内容?

适配器设计模式实现疑问:如何让统一接口兼容新旧媒体播放器?

嘿,我看了你关于适配器模式的尝试,思路方向是对的,但从你描述的场景和给出的代码片段来看,可能还没完全贴合标准适配器模式的核心结构,我来帮你理清楚问题出在哪,以及怎么调整~

先说说你的需求:你想通过一个统一的mediaPlayerInterface接口,让用户既能用新版MP4播放器,又能兼容旧版仅支持WAV的播放器——这完全符合适配器模式的应用场景,不过要实现标准的适配器模式,需要明确几个核心角色,你可能还没把它们区分开:

标准适配器模式的核心角色

  • 目标接口(Target):就是你说的mediaPlayerInterface,这是客户端唯一依赖的接口,定义统一的播放方法(比如play(format, filename))。
  • 适配者(Adaptee):这里指你的旧版WAV播放器,它有自己专属的接口(比如playWav(filename)),和目标接口不兼容,需要被适配。
  • 适配器(Adapter):衔接目标接口和适配者的核心类,它实现目标接口,同时持有适配者的实例,在目标接口的方法里调用适配者的专属方法,完成兼容。
  • 客户端(Client):只和目标接口交互,完全不用关心背后是新版播放器还是旧版+适配器。

你当前实现可能缺失的部分

  • 可能没有把旧版播放器抽成独立的适配者类,而是让它直接混入了目标接口的实现,这就不是适配器模式了,只是单一接口的功能扩展。
  • 缺少专门的适配器类来封装旧版播放器的调用逻辑,把它的专属方法转换成目标接口的统一方法。

修改后的完整示例代码

#include <iostream>
#include <string>

// 目标接口:客户端期望的统一媒体播放器接口
class MediaPlayerInterface {
public:
    virtual void play(std::string format, std::string filename) = 0;
    virtual ~MediaPlayerInterface() = default;
};

// 新版播放器:直接实现目标接口,原生支持MP4
class NewMediaPlayer : public MediaPlayerInterface {
public:
    void play(std::string format, std::string filename) override {
        if (format == "mp4") {
            std::cout << "Playing MP4 file: " << filename << std::endl;
        } else {
            std::cout << "New player doesn't support " << format << " format" << std::endl;
        }
    }
};

// 适配者:旧版WAV播放器,只有自己的专属播放方法
class OldWavPlayer {
public:
    void playWav(std::string filename) {
        std::cout << "Playing WAV file (old player): " << filename << std::endl;
    }
};

// 适配器:实现目标接口,封装旧版播放器的调用
class WavPlayerAdapter : public MediaPlayerInterface {
private:
    OldWavPlayer* oldPlayer;
public:
    WavPlayerAdapter(OldWavPlayer* player) : oldPlayer(player) {}
    
    void play(std::string format, std::string filename) override {
        if (format == "wav") {
            // 把目标接口的调用转换成旧版播放器的专属方法
            oldPlayer->playWav(filename);
        } else {
            std::cout << "Adapter doesn't support " << format << " format" << std::endl;
        }
    }
    
    ~WavPlayerAdapter() {
        delete oldPlayer;
    }
};

// 客户端代码:只依赖目标接口,完全不关心具体实现
int main() {
    MediaPlayerInterface* mp4Player = new NewMediaPlayer();
    mp4Player->play("mp4", "summer_movie.mp4");
    
    MediaPlayerInterface* wavPlayer = new WavPlayerAdapter(new OldWavPlayer());
    wavPlayer->play("wav", "classic_song.wav");
    
    delete mp4Player;
    delete wavPlayer;
    return 0;
}

关键调整说明

  1. 把旧版播放器做成独立的OldWavPlayer类,保留它原本的playWav方法,不强制它实现目标接口——这符合“不修改原有旧代码”的适配器模式原则。
  2. 新增WavPlayerAdapter类,它一边实现MediaPlayerInterface,一边持有OldWavPlayer的实例,在play方法里把WAV格式的请求转发给旧播放器的playWav方法。
  3. 客户端只需要通过MediaPlayerInterface来调用播放,完全不用区分是直接用新版播放器,还是通过适配器用旧版播放器,实现了真正的接口统一。

这样调整后,就是标准的对象适配器模式啦~以后如果要支持其他旧格式,只需要新增对应的适配器类就行,不用修改现有代码,完美符合开闭原则。

内容的提问来源于stack exchange,提问作者RajSanpui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:04:09