代理模式----C++实现

2014-11-24 07:49:45 · 作者: · 浏览: 0

代理模式

定义:

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

适用性:

在需要比较通用和复杂的对象指针代替简单的指针的时候,需要使用代理模式。以下是几种常见的情况:

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

2、 虚代理,根据需要创建开销很大的对象。

3、 保护代理,控制对原对象的访问。

4、 智能指引,取代简单的指针,在访问对象时执行一些附加操作。

结构:

\


< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yrXP1qO6PC9wPgo8cCBhbGlnbj0="left">class Subject

{

public:

virtual void Request() {};

virtual~Subject(){}

};

//真实角色类

class RealSubject:public Subject

{

public:

voidRequest()

{

cout<<"RealSubject Request"<

}

};

//代理类

class Proxy:public Subject

{

public:

Proxy(Subject *pobject):m_pSubject(pobject)

{ }

voidRequest()

{

before();

m_pSubject->Request();

after();

}

protected:

//在调用真实角色之前的一些控制操作

voidbefore()

{

cout<<"before Proxy call RealSubject Request"<

}

//在调用真实角色之后的一些控制操作

voidafter()

{

cout<<"after Proxy call RealSubject Request"<

}

private:

Subject *m_pSubject;

};

Subject *pobject = new RealSubject;

Proxy *px = newProxy(pobject);

px->Request();

\

扩展:

普通代理,有时候用户不能直接访问真实角色,只能访问代理。就是我们不能直接new一个RealSubject对象,然后传给代理。这时候我们需要改代理,让代理自动生成一个真实角色对象。

class Proxy:public Subject

{

public:

Proxy()

{

m_pSubject = new RealSubject;

}

voidRequest()

{

before();

m_pSubject->Request();

after();

}

protected:

voidbefore()

{

cout<<"before Proxy call RealSubject Request"<

}

voidafter()

{

cout<<"after Proxy call RealSubject Request"<

}

private:

Subject *m_pSubject;

};

相关模式比较:

1、 适配器模式,适配器模式为它所适配的对象提供了一个不同的接口。而代理提供的接口与它的实体的接口相同

2、 装饰模式:代理模式与装饰模式的实现类似。但装饰模式的目的是为对象添加功能,而代理则控制对对象的访问。