代理模式

在日常生活中,我们见过很多代理,比如明星经纪人。如果你要去找明星拍广告,你是不会直接找明星,明星也没时间搭理你;需要找到明星的经纪人,先跟经纪人谈,价格合适才接你的广告,否则人家就拒掉了,我们就用这个场景来写一个代理的示例。

//定义明星接口
#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();
}

运行结果:

代理模式与装饰模式容易混淆,代理模式中代理类对被代理类有控制权,可决定其执行还不执行,而装饰模式是对类对象没有控制权,也是增加了一些装饰功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值