前言
C++相对其他编程语言来说算是比较难的了,相关知识点非常多,并且有些概念理解起来比较困难,对于初学者来说可能会感觉到非常痛苦。随着项目难度的升级,需要不断地优化框架从而使整个结构更具有扩展性,那么就要具备更多更深的 C++知识点才能搞定了,而设计模式是当今已经成为面向对象程序设计的几乎所有必须掌握的知识点,可以将设计模式看做解决某一类特定问题的特别巧妙和具有洞察力的方法。所以这段时间重温 C++基础知识,并做相关总结。
正文
代理模式,提供一个代理类,外部代码与代理类打交道,而做实际工作的类则隐藏在代理类的背后,当调用代理类中的一个函数时,代理类仅转而去调用实现类中的相应函数。
代理模式的逻辑很简单:代理类派生自一个基类,由平行地派生自同一个基类的一个或多个类提供实际的实现。
如下图结构:
当一个代理对象被创建的时候,一个实现对象就分配给了它,代理对象就将函数调用发给实现对象。代理模式只有一个实现类,并且代理模式控制对其实现类的访问。
来看个示例:
#include <iostream>
using namespace std;
class ProxyBase
{
public:
virtual void f() = 0;
virtual void g() = 0;
virtual void h() = 0;
virtual ~ProxyBase(){}
};
class Implementation : public ProxyBase
{
public:
void f(){cout << "Implementation.f()" << endl;}
void g(){cout << "Implementation.g()" << endl;}
void h(){cout << "Implementation.h()" << endl;}
};
class Proxy : public ProxyBase
{
public:
Proxy(){implementation = new Implementation();}
~Proxy(){delete implementation;}
void f(){implementation->f();}
void g(){implementation->g();}
void h(){implementation->h();}
private:
ProxyBase * implementation;
};
int main()
{
Proxy p;
p.f();
p.g();
p.h();
return 0;
}
在某些情况下,类Implementation并不需要与 Proxy 具有相同的接口—Proxy 类可以任意关联Implementation类并且将函数调用提交给它,这就符合了代理的基本思想。然而,使用共同的接口可以将代理的替代物插入到客户代码中–编写客户代码只用来与原对象进行通信,不需要对其进行修改以接受代理(以上示例中,Proxy 和Implementation都继承于ProxyBase,并实现其基类的虚函数)。此外,使用共同的接口Implementation被迫实现 Proxy 需要调用的所有函数。
代理模式的用途:
1.远程代理:为不同地址空间的对象提供代理。通过某些远程对象技术实现。
2.虚拟代理:根据需要提供一种“惰性初始化”方式来创建高代价的对象。
3.保护代理:当不愿意别人拥有被代理对象的全部访问权时,使用保护代理
4.巧妙引用:当访问被代理的对象时,增加额外的活动。比如:引用计数。它以用来追踪被代理的某个特定对象被引用的次数,以实现写入时复制并防治对象起别名。
参考资料:《C++编程思想》