小米设计模式系列--proxy模式

好久没更博了,因为最近忙着学h5和安卓,驱动只看了看wifi,这个就路漫漫其修远兮了,不知道得看到何年何月。决定把前段时间学的设计模式整理下,我是个米粉,曾一直想着去小米公司工作,不过最近买了一款红米note2后,感觉很失望,不断死机,一天两充,无爱了…不过,设计模式还是要继续,小米公司还是要接着利用,因为我发现用小米公司来当设计模式写代码的例子还是不错的,容易理解。下面就开始第一个例子吧,来看看效果。
我不讲解模式本身思想,每个模式网上资料都一大把,建议先通过查点资料把模式本身思想大体看看,然后参考我的代码,可以加快理解,代码本身结构或者思想运用都写着main.cpp的注释中。所有代码基于C++实现,偶尔会借助QT一些类,本例借助的是QT的QList类,也可以借助CPP本身的list实现。

//absplatform.h
#ifndef ABSPALTFORM_H
#define ABSPALTFORM_H

#include <QDebug>
#include <QList>

/**
 * @brief 抽象的视频平台
 */
class AbsPlatform
{
public:
    virtual void showVideo(const QString &videoName) = 0;
    virtual bool includeVideo(const QString &) = 0;

protected:
    AbsPlatform(){}
    QList<QString> videoList;  //记录已有的版权视频
    QString platName;  //平台名称
};

#endif // ABSPALTFORM_H
//iqiyi.h
#ifndef IQIYI_H
#define IQIYI_H

#include "absplatform.h"

class IQiyi : public AbsPlatform
{
public:
    IQiyi();
    bool includeVideo(const QString &videoName);
    void showVideo(const QString &videoName);
};

#endif // IQIYI_H
//iqiyi.cpp
#include "iqiyi.h"

IQiyi::IQiyi()
{
    platName = "IQiyi";
    videoList.append(QString("hua qian gu"));  //增加花千骨版权
    videoList.append(QString("dao mu bi ji"));  //增加盗墓笔记版权
}

bool IQiyi::includeVideo(const QString &videoName)
{
    for(int i=0; i<videoList.length(); i++)
    {
        if(videoName == videoList.at(i))  //表示找到了
        {
            return true;
        }
    }

    return false;
}

void IQiyi::showVideo(const QString &videoName)
{
    qDebug()<<"IQiyi show video "<<videoName;
}
//tudou.h
#ifndef TUDOU_H
#define TUDOU_H

#include "absplatform.h"

class Tudou : public AbsPlatform
{
public:
    Tudou();
    bool includeVideo(const QString &videoName);
    void showVideo(const QString &videoName);
};

#endif // TUDOU_H
//tudou.cpp
#include "tudou.h"

Tudou::Tudou()
{
    platName = "tudou";
    videoList.append(QString("Naruto"));  //土豆增加火影忍者版权
}

bool Tudou::includeVideo(const QString &videoName)
{
    for(int i=0; i<videoList.length(); i++)
    {
        if(videoName == videoList.at(i))  //表示找到了
        {
            return true;
        }
    }

    return false;
}

void Tudou::showVideo(const QString &videoName)
{
    qDebug()<<"Tudou show video "<<videoName;
}
//mivideo.h
#ifndef MIVIDEO_H
#define MIVIDEO_H

#include <QDebug>
#include <QList>
#include <assert.h>

#include "absplatform.h"

class MiVideo
{
public:
    MiVideo();
    void addPlat(AbsPlatform *plat);
    void showVideo(const QString &);

private:
    QList<AbsPlatform *> listPlat;  //平台链表
};

#endif // MIVIDEO_H
//mivideo.cpp
#include "mivideo.h"

MiVideo::MiVideo()
{
}

void MiVideo::addPlat(AbsPlatform *plat)
{
    assert(plat != NULL);
    listPlat.append(plat);
}

void MiVideo::showVideo(const QString &videoName)
{
    AbsPlatform *plat;
    for(int i=0; i<listPlat.length(); i++)
    {
        plat = listPlat.at(i);
        if(plat->includeVideo(videoName))
        {
            plat->showVideo(videoName);
            return;
        }
    }

    qDebug()<<"no plat include this video";
    return;
}
//main.cpp
#include <QCoreApplication>
#include "mivideo.h"
#include "tudou.h"
#include "iqiyi.h"

/**
 * 这次以小米视频为例,来讲解Proxy(代理)模式:
 * 大家都知道,小米视频没有自己的资源,完全是整合的各大视频平台比如优酷、土豆、爱奇艺等等
 * 1.所以小米视频本身就是个代理,他只是提供接口供用户使用
 * 2.真正的视频内容或者说播放功能在各大视频厂商:土豆、爱奇艺等等,这些就是对应实体
 */
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //实例化各大平台类
    Tudou *tudouPlat = new Tudou;
    IQiyi *iqiyiPlat = new IQiyi;

    //整合各大平台
    MiVideo *miVideo = new MiVideo;
    miVideo->addPlat(tudouPlat);  //加入土豆平台
    miVideo->addPlat(iqiyiPlat);  //加入爱奇艺平台

    //客户点播视频节目
    miVideo->showVideo(QString("Naruto"));  //会从土豆播放
    miVideo->showVideo(QString("hua qian gu"));  //会从爱奇艺播放

    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浓咖啡jy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值