c++设计模式之代理模式

13 篇文章 0 订阅
10 篇文章 1 订阅

 我的这篇博客的思想均来自于博客:那谁的技术博客wang_gary。非常感谢他们带我进入代理模式。

按照设计模式中介绍思路:

意图:为其他对象提供一种代理以控制这个对象的访问。

适用性:

1、远程代理(remote proxy),为一个对象在不同的地址空间提供局部代理,

2、虚代理(virtual proxy), 根据需要创建开销很大的对象

3、保护代理(protection proxy),控制对原始对象的访问,保护代理用于对象应该有不同的访问权限的时候。

4、智能指针(smart reference),取代了简单的指针,它在访问对象时执行一些附加操作,包括(1、对指向实际对象的引用计数,当该对象没有引用时,可以自动释放它;2、当第一次引用一个持久对象时,将它装入内存;3、在访问一个实际对象前,检查是否已经锁定了他,以确保其他对象不能改变它)

参与者:

proxy:提供一个与subject的接口相同的接口,这样代理就可以代替实体

subject:定义realsubject与proxy的共用接口,这样在任何使用realsubject的地方都可以使用proxy代替

realsubject:定义proxy所代表的实体

接下来我们使用程序简单展示一下:

proxy.h

//设计模式之代理模式proxy
//例子代码来自http://www.cppblog.com/converse/
//作者:李创
/*
作用:为其他对象提供一种代理用以控制这个对象的访问
先上手一个最简单的例子
*/

//定义一个抽象基类subject,并定义共有接口
//这样就可以在任何需要使用realsubject的时候都使用proxy了
class subject
{
public:
	subject(){}
	virtual ~subject(){}

public:
	virtual void Request() = 0;
};

//定义真正的实体
class realsubject :public subject
{
public:
	realsubject();
	virtual ~realsubject();

public:
	virtual void Request();
};

//定义代理类,含有一个指向realsubject的对象的指针
class proxy :public subject
{
public:
	proxy();
	virtual ~proxy();

public:
	virtual void Request();

private:
	realsubject* pRealsubject;
};


proxy.cpp

#include <iostream>
#include "proxy.h"
using namespace std;

realsubject::realsubject()
{
	cout<<"constructing a realsubject"<<endl;
}

realsubject::~realsubject()
{
	cout<<"distory the realsubject"<<endl;
}
void realsubject::Request()
{
	cout<<"request by realsubject"<<endl;
}

proxy::proxy()
{
	pRealsubject = NULL;
	cout<<"constructing a proxy"<<endl;
}

proxy::~proxy()
{
	delete pRealsubject;
	pRealsubject = NULL;
	cout<<"distory the proxy"<<endl;
}

void proxy::Request()
{
	//需要使用realsubject的时候去初始化一下
	if(NULL == pRealsubject)
	{
		cout<<"request by proxy"<<endl;
		pRealsubject = new realsubject();
	}

	pRealsubject->Request();
}

实际使用的时候,我们可以这样:

	subject *pProxy = new proxy();
	pProxy->Request();
	delete pProxy;
	pProxy = NULL;


通过这个小例子,代理模式的用法可以说很清晰了,那接下来我们上一个非常形象的例子:

proxy.h

/*
大家都看过水浒,接下来的例子就是根据水浒西门庆与潘金莲的故事而作
*/
//首先抽象出一个风骚女人的基类
class loosewomen
{
public:
	loosewomen(){};
	virtual ~loosewomen(){};

public:
	//风骚女人会向男人抛媚眼
	virtual void makeeyeswithman() = 0;
	//风骚女人跟男人XX
	virtual void makelovewithman() = 0;

};
//声明一个代理类(媒婆),所有的操作都可以通过媒婆来安排
class wangpo:public loosewomen
{
public:
	wangpo(loosewomen *pwomen);
	~wangpo();
public:
	void makeeyeswithman();
	void makelovewithman();
private:
	loosewomen *ploosewomen;
};
//实例化一个风骚女,潘金莲
class panjinlian:public loosewomen
{
public:
	panjinlian();
	~panjinlian();

public:
	void makeeyeswithman();
	void makelovewithman();
};
//实例化一个风骚女,小凤仙
class xiaofengxian:public loosewomen
{
public:
	xiaofengxian();
	~xiaofengxian();

public:
	void makeeyeswithman();
	void makelovewithman();

};


proxy.cpp

wangpo::wangpo(loosewomen *pwomen)
{
	ploosewomen = pwomen;
}

wangpo::~wangpo()
{
	delete ploosewomen;
}

void wangpo::makeeyeswithman()
{
	ploosewomen->makeeyeswithman();
}
void wangpo::makelovewithman()
{
	ploosewomen->makelovewithman();
}

panjinlian::panjinlian()
{
	cout<<" panjinlian born "<<endl;
}
panjinlian::~panjinlian()
{
	cout<<"panjinlian death"<<endl;
}
void panjinlian::makeeyeswithman()
{
	cout<<"panjinlian make eyes"<<endl;
}
void panjinlian::makelovewithman()
{
	cout<<"panjinlian make love"<<endl;
}

xiaofengxian::xiaofengxian()
{
	cout<<"xiaofengxian born"<<endl;
}
xiaofengxian::~xiaofengxian()
{
	cout<<"xiaofengxian death"<<endl;
}
void xiaofengxian::makeeyeswithman()
{
	cout<<"xiaofengxian make eyes"<<endl;
}
void xiaofengxian::makelovewithman()
{
	cout<<"xiaofengxian make love"<<endl;
}


使用时可以这样:

	wangpo *pwangpo;
	pwangpo = new wangpo(new panjinlian());
	pwangpo->makeeyeswithman();
	pwangpo->makelovewithman();
	delete pwangpo;

	pwangpo = new wangpo(new xiaofengxian());
	pwangpo->makeeyeswithman();
	pwangpo->makelovewithman();
	delete pwangpo;


这里的程序非常简单易懂,就不一一解析了。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值