我实现的适配器设计模式是否正确?若有误需补充或修改哪些内容?
适配器设计模式实现疑问:如何让统一接口兼容新旧媒体播放器?
嘿,我看了你关于适配器模式的尝试,思路方向是对的,但从你描述的场景和给出的代码片段来看,可能还没完全贴合标准适配器模式的核心结构,我来帮你理清楚问题出在哪,以及怎么调整~
先说说你的需求:你想通过一个统一的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; }
关键调整说明
- 把旧版播放器做成独立的
OldWavPlayer类,保留它原本的playWav方法,不强制它实现目标接口——这符合“不修改原有旧代码”的适配器模式原则。 - 新增
WavPlayerAdapter类,它一边实现MediaPlayerInterface,一边持有OldWavPlayer的实例,在play方法里把WAV格式的请求转发给旧播放器的playWav方法。 - 客户端只需要通过
MediaPlayerInterface来调用播放,完全不用区分是直接用新版播放器,还是通过适配器用旧版播放器,实现了真正的接口统一。
这样调整后,就是标准的对象适配器模式啦~以后如果要支持其他旧格式,只需要新增对应的适配器类就行,不用修改现有代码,完美符合开闭原则。
内容的提问来源于stack exchange,提问作者RajSanpui
相关产品推荐
相关产品推荐

