設計模式(4)--代理模式

//4.代理模式
//ver1
//被追求者類
class SchoolGirl
{
private:
	string _name;
public:
	SchoolGirl(){}
	SchoolGirl(string name)
	{
		_name = name;
	}
	string GetName()
	{
		return _name;
	}
	void SetName(string name)
	{
		_name = name;
	}
};

//接口函數類
class GiveGift
{
public:
	GiveGift(){}

	//Interface
	virtual void GiveToy()
	{
		//...
	}
	virtual void GiveFlower()
	{
		//...
	}
};

//追求者類
class Pursuit : public GiveGift
{
private:
	SchoolGirl _mm;
public:
	Pursuit(SchoolGirl mm)
	{
		_mm = mm;
	}

	void GiveToy()
	{
		_mm.GetName(); // + 送你玩具
	}
	void GiveFlower()
	{
		_mm.GetName(); // + 送你花
	}
};

//代理類 //代理也去實現 "送禮物" 的接口
class Proxy : public GiveGift
{
private:
	Pursuit *pps;

public:
	Proxy(SchoolGirl mm)
	{
		pps = new Pursuit(mm);
	}
	void GiveFlower()
	{
		pps->GiveFlower(); //在實現方法中去調用"追求者"類的相關方法;
	}
	void GiveToy()
	{
		pps->GiveToy();
	}
};

void main1()
{
	SchoolGirl mm("ysl");
	Proxy *pp1 = new Proxy(mm);
	pp1->GiveFlower(); //SchoolGirl不認識Pursuit,但能夠經過Proxy獲得禮物。
	pp1->GiveToy();
}

//代理模式: 爲其餘對象提供一種代理以控制對這個對象的訪問.

 

//4.代理模式
//ver2
//Subject: 定義了 RealSubject 和 Proxy 的共用接口。這樣在任何使用 RealSubject的地方均可以使用Proxy
class Subject
{
public:
	virtual void Request() = 0;
};
//RealSubject: 定義Proxy所表明的真實實體。
class RealSubject : public Subject
{
public:
	virtual void Request()
	{
		//真實請求
	}
};

//Proxy: 保存一個引用使得代理能夠訪問實體。
class Proxy : public Subject
{
private:
	RealSubject *rs;
public:
	virtual void Request()
	{
		if (rs == NULL)
		{
			rs = new RealSubject();
		}
		rs->Request();
	}
};

void main2()
{
	Proxy *pp1 = new Proxy();
	pp1->Request();
}

  

//代理模式場合:
//一.遠程代理。也就是爲一個對象在不一樣的地址空間提供局部表明。這樣能夠隱藏一個對象存在於不一樣地址空間的事實。
//二.虛擬代理。是根據須要建立開銷很大的對象。經過它來存放實例化須要很長時間的真實對象。
//三.安全代理。用來控制真實對象訪問時的權限。
//四.智能指引。當調用真實的對象時,代理處理另一些事。安全

相關文章
相關標籤/搜索