C++设计模式——代理模式

  • 格式:pdf
  • 大小:84.98 KB
  • 文档页数:2

C++设计模式——代理模式

代理模式(Proxy),为其他对象提供⼀种代理以控制这个对象的访问

Subject:定义RealSubject和Proxy的共⽤接⼝,这样就可以在任何使⽤RealSubject的地⽅都可以使⽤Proxy。

class Subject //Subject 定义了RealSubject和Proxy的共⽤接⼝..这样就在任何使⽤RealSubject的地⽅都可以使⽤Proxy

{

public:

virtual void func()

{

cout << "Subject" << endl;

}

};

RealSubject:真实处理业务的⾓⾊。

class RealSubject :public Subject // RealSubject 定义proxy所代表的真实实体

{

public:

virtual void func()

{

cout << "RealSubject" << endl;

}

};

Proxy:保存⼀个引⽤使得代理可以访问实体。

class Proxy : public Subject //proxy 保存⼀个引⽤使得代理可以访问实体,并且提供⼀个于Subject的接⼝相同的接⼝ 这样代理就可以⽤来替代实体

{

RealSubject real;

public:

virtual void func()

{

cout << "Proxy" << endl;

real.func();

}

};

提供⼀个与Subject的接⼝相同的接⼝,这样代理就可以⽤来代替实体。

代码:

#include

using namespace std;

class Subject //Subject 定义了RealSubject和Proxy的共⽤接⼝..这样就在任何使⽤RealSubject的地⽅都可以使⽤Proxy

{

public:

virtual void func()

{

cout << "Subject" << endl;

}

};

class RealSubject :public Subject // RealSubject 定义proxy所代表的真实实体

{

public:

virtual void func()

{

cout << "RealSubject" << endl;

}

};

class Proxy : public Subject //proxy 保存⼀个引⽤使得代理可以访问实体,并且提供⼀个于Subject的接⼝相同的接⼝ 这样代理就可以⽤来替代实体

{

RealSubject real;

public:

virtual void func()

{

cout << "Proxy" << endl;

real.func();

}

};int main()

{

Proxy proxy;

proxy.func();

return 0;

}

—— 参考⼤话设计模式

代理模式应⽤:

根据⽬的和实现⽅式的不同,代理模式可分为很多种,常见的有:

远程代理(Remote Proxy)

为⼀个位于不同地址空间的对象提供⼀个本地代理,对代理的⽅法调⽤会导致对远程对象的⽅法调⽤。ATM 就是⼀个例⼦,ATM 可能会持

有(存在于远程服务器中的)银⾏信息的⼀个代理对象。

虚拟代理(Virtual Proxy)

使⽤虚拟代理,代理可以作为⼀个(资源消耗较⼤的)对象的代表。虚拟代理经常延迟对象的创建,直到需要为⽌。在创建对象之前(及创

建对象过程中),虚拟代理也可以作为对象的代理;之后,代理将请求直接委托给 RealSubject。

保护代理(Protection Proxy)

根据访问权限,可以使⽤保护代理来控制对资源的访问。例如,有⼀个员⼯对象,保护代理可以允许普通员⼯调⽤对象的某些⽅法,管理员

调⽤其他⽅法。

缓冲代理(Cache Proxy)

为某⼀个⽬标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

智能引⽤代理(Smart Reference Proxy)

当⼀个对象被引⽤时,提供⼀些额外的操作(例如:将对象被调⽤的次数记录下来)。

优缺点

优点:

职责清晰:真实⾓⾊就是实现实际的业务逻辑,不关⼼其他⾮本职责的事务,通过后期的代理完成⼀件事务,附带的结果就是编程简介清

晰。

⾼扩展性:具体主题⾓⾊可变。

缺点:

这种模式引⼊了另⼀个抽象层,这有时可能是⼀个问题。如果真实主题被某些客户端直接访问,并且其中⼀些客户端可能访问代理类,这可

能会导致不同的⾏为。

由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

实现代理模式需要额外的⼯作,有些代理模式的实现⾮常复杂