小米設計模式系列--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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章