适配器模式(C++)

意图:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
使用场景
1、当使用一个已经存在的类时,而它的接口不符合你的需求
2、创建一个可以复用的类,并且该类可以与其他不相关的类或不可预见的类协同工作
3、对于对象适配器向使用其已经存在的子类

优缺点

优点: 
	1、可以让任何两个没有关联的类一起运行。 
	2、提高了类的复用。 
	3、增加了类的透明度。 
	4、灵活性好。
缺点: 
	1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,
	其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果
	不是很有必要,可以不使用适配器,而是直接对系统进行重构。
UML结构(源于菜鸟教程中使用java实现适配器的UML图)

在这里插入图片描述

/*
 * @Description: 
 * @Author: ysq
 * @Date: 2020-06-11 23:40:58
 * @LastEditTime: 2020-06-12 20:00:01
 * @LastEditors: ysq
 */ 
#include <iostream>
#include <string.h>

using namespace std;
class AdvancedMediaPlayer
{
public:
    AdvancedMediaPlayer(){}
    virtual ~AdvancedMediaPlayer(){}
    virtual void playVlc(std::string Filename) = 0;
    virtual void playMp4(std::string Filename) = 0;
};

class VlcPlayer : public AdvancedMediaPlayer
{
public:
    VlcPlayer(){}
    ~VlcPlayer(){}
    void playVlc(std::string Filename)
    {
        cout << "play VLC filename is " << Filename << endl;
    }
    void playMp4(std::string Filename){}
};

class Mp4Player : public AdvancedMediaPlayer
{
public:
    Mp4Player(){}
    ~Mp4Player(){}
    void playVlc(std::string Filename){}
    void playMp4(std::string Filename) 
    {
        cout << "play Mp4 filename is " << Filename << endl;
    }
};


class MediaPlayer
{
public:
    MediaPlayer(){}
    virtual ~MediaPlayer(){}
    virtual void play(std::string audioType, std::string Filename) = 0;
};

class MediaAdapter : public MediaPlayer
{
public:
    MediaAdapter(){}
    ~MediaAdapter()
    {
        if(advancemediaplayer != nullptr)
        {
            delete advancemediaplayer;
            advancemediaplayer = nullptr;
            cout << "advancemediaplayer is delete " << endl;
        }
    }
    void play(std::string audioType, std::string Filename)
    {
        if (audioType == "Mp4")
        {
            advancemediaplayer = new Mp4Player();
            advancemediaplayer->playMp4(Filename);
        }
        if (audioType == "vlc")
        {
            advancemediaplayer = new VlcPlayer();
            advancemediaplayer->playVlc(Filename);
        }
    }
private:
    AdvancedMediaPlayer *advancemediaplayer;
};

class AudioPlayer : public MediaPlayer
{
public:
    AudioPlayer(){}
    ~AudioPlayer()
    {
        if(mediaadapter != nullptr)
        {
            delete mediaadapter;
            mediaadapter = nullptr;
        }
    }
    void play(std::string audioType, std::string Filename)
    {
        if (audioType == "mp3")
        {
            cout << "mp3 file is support  Filename" << Filename << endl;
        }
        else if (audioType == "Mp4" || audioType == "vlc")
        {
            mediaadapter = new MediaAdapter();
            mediaadapter->play(audioType, Filename);
        }
        else
        {
            cout << Filename << "file is not support" << endl;
        }
        
    }
private:
    MediaAdapter *mediaadapter;
};
int main()
{
    AudioPlayer *audio = new AudioPlayer();
    audio->play("mp3", "mp3 file");
    audio->play("Mp4", "Mp4 file");
    audio->play("vlc", "vlc file");
    audio->play("m4a", "m4a file");
    //media->~MediaAdapter();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值