6、C++设计模式——适配器模式(菜鸟教程例子)

原例网址:适配器模式(菜鸟教程)

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

 

复制代码
  1 #include "iostream"
  2 #include "string"
  3 using namespace std;
  4 
  5 
  6 
  7 //步骤1 为媒体播放器和更高级的媒体播放器创建接口
  8 class MediaPlayer
  9 {
 10 public:
 11     virtual void play(string audioType, string fileName) = 0;
 12 };
 13 
 14 class AdvancedMediaPlayer
 15 {
 16 public:
 17     virtual void playVlc(string fileName) = 0;
 18     virtual void playMp4(string fileName) = 0;
 19 };
 20 
 21 
 22 
 23 //步骤2 创建实现了 AdvancedMediaPlayer 接口的实体类
 24 class VlcPlayer : public AdvancedMediaPlayer
 25 {
 26 public:
 27     void playVlc(string fileName)
 28     {
 29         cout << "Playing vlc file. Name: " << fileName << endl;
 30     }
 31     void playMp4(string fileName)
 32     {
 33         //什么也不做
 34     }
 35 };
 36 
 37 class Mp4Player : public AdvancedMediaPlayer
 38 {
 39 public:
 40     void playVlc(string fileName)
 41     {
 42         //什么也不做
 43     }
 44     void playMp4(string fileName)
 45     {
 46         cout << "Playing mp4 file. Name: " << fileName << endl;
 47     }
 48 };
 49 
 50 
 51 
 52 //步骤3 创建实现了 MediaPlayer 接口的适配器类
 53 class MediaAdapter : public MediaPlayer
 54 {
 55 public:
 56     MediaAdapter(string audioType)    //构造函数
 57     {
 58         if ( audioType == "vlc" )
 59             advancedMusicPlayer = new VlcPlayer();
 60         else if ( audioType == "mp4" )
 61             advancedMusicPlayer = new Mp4Player();
 62         else
 63             cout << "未知audioType" << endl;
 64     }
 65 
 66     void play(string audioType, string fileName)
 67     {
 68         if ( audioType == "vlc" )
 69             advancedMusicPlayer->playVlc(fileName);
 70         else if ( audioType == "mp4" )
 71             advancedMusicPlayer->playMp4(fileName);
 72         else
 73             cout << "未知audioType" << endl;
 74     }
 75 private:
 76     AdvancedMediaPlayer* advancedMusicPlayer;
 77 };
 78 
 79 
 80 
 81 //步骤4 创建实现了 MediaPlayer 接口的实体类
 82 class AudioPlayer : public MediaPlayer
 83 {
 84 public:
 85     void play(string audioType, string fileName)
 86     {
 87         //播放 mp3 音乐文件的内置支持
 88         if ( audioType == "mp3" ) {
 89             cout << "Playing mp3 file. Name: " << fileName << endl;
 90         }
 91         //mediaAdapter 提供了播放其他文件格式的支持
 92         else if ( ( audioType == "vlc" ) || ( audioType == "mp4" ) ) {
 93             mediaAdapter = new MediaAdapter(audioType);
 94             mediaAdapter->play(audioType, fileName);
 95         }
 96         else {
 97             cout << "未知audioType" << endl;
 98         }
 99     }
100 
101 private:
102     MediaAdapter* mediaAdapter; 
103 };
104 
105 
106 
107 //步骤5 使用 AudioPlayer 来播放不同类型的音频格式
108 void main()
109 {
110     AudioPlayer* audioPlayer = new AudioPlayer();
111 
112     audioPlayer->play("mp3","beyond the horizon.mp3");
113     audioPlayer->play("mp4","alone.mp4");
114     audioPlayer->play("vlc", "far far away.vlc");
115     audioPlayer->play("avi", "mind me.avi");
116 
117     delete audioPlayer;
118     audioPlayer = NULL;
119 
120     system("pause");
121 }
复制代码

 

运行结果:

posted @   张三Nefe  阅读(245)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示