好久没更博了,因为最近忙着学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();
}