好久沒更博了,因爲最近忙着學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();
}