代理模式(Proxy)-设计模式(十一)

1、作用

为其他对象提供一种代理以控制对这个对象的访问。 简单的说,就是客户端和目标端之间的中介。

举个例子:

房东出租房子,但懒得自己找租客,因此找了中介,由中介代理租房,租客租房子,直接找不到房东,通过中介找房东租房子,这个中介可以看作是代理。

优点:

  • 通过一个代理对象完成一系列的操作处理,在以后的改动中,就会允许操作对象(动态修改、添加等),符合开放封闭原则
  • 代理模式协调了调用者和被调用者,降低了代码的耦合度, 扩转性较好
  • 可以以小对象代理大对象,减少消耗(虚拟代理)

代理场景:

  • 远程代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,(比如打开一个图像处理对象)。
  • 安全代理:用来控制真实对象访问的权限。
  • 智能指针:取代了简单的指针,它在访问对象时执行一些附加操作。

角色:

Subject: 定义了真正调用的对象和代理的公有接口,这样就可以在使用realSubject 的任何地方都能使用Proxy。

Proxy: 控制对象的实体,可以创建和删除,被代理的对象直到真正使用的时候才会被创建初始化,没有使用到的时候用一个Proxy作一个占位符。

RealSubject: 被代理类

UML 结构图:

在这里插入图片描述

例子:

#include<iostream>
using namespace std;
//定义了 Proxy 和 Landlord 的公有接口,
//这样就可以在任何需要使用到Landlord的地方都使用Proxy
class Subject
{
public:
	Subject(){}
	virtual ~Subject(){}
	virtual void rentHouse() = 0;
};
//真正使用的实体,被代理类 
class Landlord:public Subject
{
public:
	Landlord()
	{ 
		cout << "construction Landlord" << endl;
	}
	virtual ~Landlord(){}
	virtual void rentHouse()
	{ 
		cout << "The landlord rents out the house." << endl;
	}
};

//代理类,含有一个指向Landlord对象的指针,房屋中介 
class Proxy:public Subject
{
public:
	Proxy() : m_pLandlord(NULL)
	{ 
		cout << "construction a Proxy" << endl;
	}
	virtual ~Proxy()
	{
		delete m_pLandlord;
		m_pLandlord = NULL;
	}
	virtual void rentHouse()
	{
		//需要使用Landlord的时候才去初始化
		if(NULL == m_pLandlord)
		{
			cout << "Realquest by Proxy" << endl;
			m_pLandlord = new Landlord();
		}
		m_pLandlord->rentHouse();
	}
		
private:
	Landlord* m_pLandlord;
};

class  Renter
{
public:
	Renter() : m_pProxy(NULL)
	{
	}
	virtual ~Renter()
	{
		delete m_pProxy;
		m_pProxy = NULL;
	}
	void findHouse()
	{
		cout << "A tenant rents a house by proxy." << endl;
		if(m_pProxy == NULL)
		{
			m_pProxy = new Proxy();
		}
		m_pProxy->rentHouse();
	}
	
private:
	Proxy* m_pProxy;
};

int main()
{
	Renter* pRenter = new Renter();
	pRenter->findHouse();
	
	delete pRenter;
	pRenter = NULL;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值