我是靠谱客的博主 舒适小鸭子,这篇文章主要介绍设计模式6 - 适配器模式适配器模式使用场景优缺点注意事项UML结构图代码实现,现在分享给大家,希望可以做个参考。

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

使用场景

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要。
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  • 需要一个统一的输出接口,而输入端的类型不可预知。

优缺点

  • 优点:
    1、可以让任何两个没有关联的类一起运行。
    2、提高了类的复用。
    3、增加了类的透明度。
    4、灵活性好。

  • 缺点:
    过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

注意事项

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

UML结构图

在这里插入图片描述

代码实现

first_interface.h
创建抽象类 - 多媒体播放器; 创建具体类 - vlc播放器、mp4播放器

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string> #include <iostream> using namespace std; class AdvancedMediaPlayer //基类-多媒体播放器 { public: AdvancedMediaPlayer() {} virtual ~AdvancedMediaPlayer() {} virtual void playVlc(string fileName) = 0; virtual void playMp4(string fileName) = 0; }; class VlcPlayer: public AdvancedMediaPlayer //子类-vlc播放器 { public: void playVlc(string fileName) { cout << "Playing vlc file. Name: " + fileName << endl; } void playMp4(string fileName) { cout << fileName + " do nothing" << endl; } }; class Mp4Player: public AdvancedMediaPlayer //子类-mp4播放器 { public: void playVlc(string fileName) { cout << fileName + " do nothing" << endl; } void playMp4(string fileName) { cout << "Playing mp4 file. Name: " + fileName << endl; } };

second_interface.h
原来的AudioPlayer只能播放mp3格式的文件,通过适配器MediaAdapter就可以播放vlc和mp4格式的文件了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "first_interface.h" class MediaPlayer //基类-音乐播放器 { public: MediaPlayer() {} virtual ~MediaPlayer() {} virtual void play(string audioType, string fileName) = 0; }; class MediaAdapter: public MediaPlayer { public: MediaAdapter(string audioType) { if (audioType == "vlc") { player = new VlcPlayer(); } else if(audioType == "mp4") { player = new Mp4Player(); } else { player = nullptr; } } void play(string audioType, string fileName) { if (audioType == "vlc") { player->playVlc(fileName); } else if(audioType == "mp4") { player->playMp4(fileName); } } public: AdvancedMediaPlayer *player; }; //默认 AudioPlayer 可以播放 mp3 格式的音频文件,通过适配器类 MediaAdapter 来播放 vlc 和 mp4 格式的文件 class AudioPlayer: public MediaPlayer { public: void play(string audioType, string fileName) { if (audioType == "mp3") { cout << "Playing mp3 file. Name: " + fileName << endl; } else if(audioType == "mp4" || audioType == "vlc") { MediaAdapter * adapter = new MediaAdapter(audioType); adapter->play(audioType, fileName); } else { cout << "Invalid media. " + audioType + " format not supported"; } } };

main.cpp
实例应用 - 使用播放器播放各种格式的文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "second_interface.h" int main() { AudioPlayer *audioPlayer = new AudioPlayer(); audioPlayer->play("mp3", "beyond the horizon.mp3"); audioPlayer->play("mp4", "alone.mp4"); audioPlayer->play("vlc", "far far away.vlc"); audioPlayer->play("avi", "mind me.avi"); return 0; } 运行结果: Playing mp3 file. Name: beyond the horizon.mp3 Playing mp4 file. Name: alone.mp4 Playing vlc file. Name: far far away.vlc Invalid media. avi format not supported

最后

以上就是舒适小鸭子最近收集整理的关于设计模式6 - 适配器模式适配器模式使用场景优缺点注意事项UML结构图代码实现的全部内容,更多相关设计模式6内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部