第七章-代理模式

代理模式(Proxy): 为其他对象提供一种代理以控制对这个对象的访问。

图片

追求者代理代码

#include<iostream>
#include<string>

using namespace std;

class SchoolGirl
{
private:
	string name;
public:
	string get() { return name; }
	void set(string name_t) { name = name_t; }
};

class GiveGift
{
public:
	virtual void GiveDolls() = 0;
	virtual void GiveFlowers() = 0;
	virtual void GiveChocolate() = 0;
};

class Pursuit : public GiveGift
{
	SchoolGirl *mm;

public:
	Pursuit(SchoolGirl *mm_t)
	{
		mm = mm_t;
	}

	void GiveDolls()
	{
		cout << mm->get() << " 送你洋娃娃";
	}

	void GiveFlowers()
	{
		cout << mm->get() << " 送你鲜花";
	}

	void GiveChocolate()
	{
		cout << mm->get() << " 送你巧克力";
	}

};

class Proxy :GiveGift
{
private:
	Pursuit *gg;

public:
	Proxy(SchoolGirl *mm_t)
	{
		gg = new Pursuit(mm_t);
	}

	void GiveDolls()
	{
		gg->GiveDolls();
	}

	void GiveFlowers()
	{
		gg->GiveFlowers();
	}

	void GiveChocolate()
	{
		gg->GiveChocolate();
	}
};

int main()
{
	SchoolGirl *jiaojiao = new SchoolGirl();
	jiaojiao->set("李娇娇");

	Proxy *daili = new Proxy(jiaojiao);

	daili->GiveDolls();
	daili->GiveFlowers();
	daili->GiveChocolate();
	

	system("pause");
	return 0;
}

图片

基本代码

#include<iostream>
#include<string>

using namespace std;


//Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy
class Subject
{
public:
	virtual void Request() = 0;
};

//RealSubject类,定义Proxy所代表的的真实实体
class RealSubject :public Subject
{
public:
	void Request()
	{
		cout << "真实的请求";
	}
};

//Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体
class Proxy :public Subject
{
private:
	RealSubject *realSubject;

public:
	void Request()
	{
		if (realSubject == nullptr)
		{
			realSubject = new RealSubject();
		}
		realSubject->Request();
	}
};

int main()
{

	Proxy *proxy = new Proxy();
	proxy->Request();

	system("pause");
	return 0;
}

代理模式应用

  1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  2. 虚拟代理,是根据需要创建开销很大对象,通过它来存放实例化需要很长时间的真是对象。(例如打开一个HTML页面时,未打开的图片框,就是通过虚拟代理来替代了真是的图片,此时代理存储了真是图片的路径和尺寸)。
  3. 安全代理,用来控制真是对象访问时的权限。
  4. 智能指引,是指当调用真是的对象时,代理处理另外一些事(如计算真实对象的引用次数)。
原文地址:https://www.cnblogs.com/wfcg165/p/11991074.html