[大话设计模式] 第7章: 代理模式

代理模式(Proxy)

  • 代理模式:为其他对象提供一种代理以控制对这个对象的访问。实际上是在访问对象时引入一定程度的间接性。
  • 远程代理:为一个对象在不同地址空间提供局部代表,隐藏一个对象存在于不同空间的事实。如.Net加入Web引用,引入WebService,此时项目会生成WebReference的文件夹,就是代理。
  • 虚拟代理:根据需要创建开销很大的对象,通过它存放实例化需很长时间的真实对象。HTML中的多图,就是通过虚拟代理代替了真实图片,存储路径和尺寸。
  • 安全代理:控制真实对象的访问权限,用于对象应该拥有不同的访问权限时。
  • 智能指引:当调用真实对象时,代理处理一些另外的事情。通过代理在访问对象时增加一些内务处理。

UML类图

### 实例分析

场景描述: 某追求者(Pursuit类)追求女同学(SchoolGirl类), 但是由于不在一个班不能直接给女同学送礼物, 需要一个代理(Proxy类)帮忙送礼物.

UML类图

代码实现

#include <iostream>
#include <string>

using namespace std;

// 被追求者类
class SchoolGirl
{
public:
	SchoolGirl() {}
	SchoolGirl(string n) : name(n){}
	string get_name(){ return name; }
private:
	string name;
};

// 代理与追求者公共接口
class IGiveGift
{
public:
virtual void give_dolls() = 0;
virtual void give_flowers() = 0;
virtual void give_chocolate() = 0;	
};

// 追求者类
class Pursuit : public IGiveGift
{
public:
	Pursuit(SchoolGirl *sg) : mm(sg){ }
	void give_dolls();
	void give_flowers();
	void give_chocolate();
private:
	SchoolGirl *mm;
};


void Pursuit::give_dolls()
{
	cout << "Give dolls to " << mm->get_name() << endl;
}
void Pursuit::give_flowers()
{
	cout << "Give flowers to " << mm->get_name() << endl;
}
void Pursuit::give_chocolate()
{
	cout << "Give chocolate to " << mm->get_name() << endl;
}

// 代理类
class Proxy : public IGiveGift
{
public:
	Proxy(SchoolGirl *mm);
	~Proxy();
	void give_dolls();
	void give_flowers();
	void give_chocolate();
private:
	Pursuit *gg;
};

Proxy::Proxy(SchoolGirl *mm)
{
	gg = new Pursuit(mm);
}
Proxy::~Proxy()
{
	delete gg;
}

void Proxy::give_dolls()
{
	gg->give_dolls();
}
void Proxy::give_flowers()
{
	gg->give_flowers();
}
void Proxy::give_chocolate()
{
	gg->give_chocolate();
}

// 客户端
int main()
{
	SchoolGirl s_girl("娇娇");
	Proxy daili(&s_girl);
	daili.give_flowers();
	daili.give_dolls();
	daili.give_chocolate();

	return 0;
}

/* 输出
Give flowers to 娇娇
Give dolls to 娇娇
Give chocolate to 娇娇
*/
posted @ 2017-08-16 17:08  moon1992  阅读(139)  评论(0编辑  收藏  举报