在日常生活中,我们见过很多代理,比如明星经纪人。如果你要去找明星拍广告,你是不会直接找明星,明星也没时间搭理你;需要找到明星的经纪人,先跟经纪人谈,价格合适才接你的广告,否则人家就拒掉了,我们就用这个场景来写一个代理的示例。
//定义明星接口
#pragma once
class IStar
{
public:
virtual ~IStar();
virtual void PlayAD(int price) = 0;
protected:
IStar();
};
#include "IStar.h"
IStar::IStar()
{
}
IStar::~IStar()
{
}
//定义明星
#pragma once
#include "IStar.h"
class CSuperStar :
public IStar
{
public:
CSuperStar();
~CSuperStar();
void PlayAD(int price);
};
#include "SuperStar.h"
#include <iostream>
using namespace std;
CSuperStar::CSuperStar()
{
}
CSuperStar::~CSuperStar()
{
}
void CSuperStar::PlayAD(int price)
{
cout << "广告展示" << endl;
}
//定义经纪人
#pragma once
#include "IStar.h"
class StarProxy :
public IStar
{
public:
StarProxy();
~StarProxy();
void SetStar(IStar* pStar);
void PlayAD(int price);
private:
IStar* mStar;
};
#include "StarProxy.h"
#include <iostream>
using namespace std;
StarProxy::StarProxy()
{
mStar = nullptr;
}
StarProxy::~StarProxy()
{
if (mStar)
{
delete mStar;
mStar = nullptr;
}
}
void StarProxy::SetStar(IStar* pStar)
{
if (mStar)
{
delete mStar;
mStar = nullptr;
}
mStar = pStar;
}
void StarProxy::PlayAD(int price)
{
if (price > 1000000)
{
if (mStar)
{
mStar->PlayAD(price);
}
else
{
cout << "没有明星" << endl;
}
}
else
{
cout << "价格太低面谈" << endl;
}
}
//调用
#include "StarProxy.h"
#include "SuperStar.h"
#include <iostream>
using namespace std;
void main(int argc, char** argv)
{
StarProxy* pStarProxy = new StarProxy();
CSuperStar* pStar = new CSuperStar();
pStarProxy->SetStar(pStar);
pStarProxy->PlayAD(1000);
pStarProxy->PlayAD(1000000000);
cin.get();
}
运行结果:
代理模式与装饰模式容易混淆,代理模式中代理类对被代理类有控制权,可决定其执行还不执行,而装饰模式是对类对象没有控制权,也是增加了一些装饰功能。