您的位置:首页 > 编程语言 > C语言/C++

【重读设计模式】代理模式

2014-10-13 00:07 281 查看
说起代理模式,应该基本是众所周知的了,原因是是因为代理无论是在现实中还是软件中实在是一个频繁出现的词。而且代理模式本身就像代理一样,提供一个替身一样的事物去代替真是的主题。但是,很多人不知道的是,代理模式是一个大模式,为什么说大呢?是因为代理模式分为很多类的代理模式,就正如现实中有商品的代理商,有法律中的代理人等等,设计模式中的代理模式也有很多中。

定义:为另外一个对象提供一个替身或者占位符以控制对这个对象的访问。

定义解释:和传统意义上的代理一样,代理模式就是为一个对象提供一个替身(替身的含义就是和真实的对象一样,具有相同的功能,但是不是真实的对象),调用者可以不知道该对象就是一个替身而认为他本身就是真实的。代理模式最常见的就是远程代理,缓存代理的使用场景也较多,虚拟代理和保护代理也是代理模式的场景,但是使用较少。这里主要以远程代理来描述该模式。

使用场景:学校的学生管理系统是一个复杂的大系统,其中就分为学生信息管理,课程管理,图书管理等等,这些系统一般来说是独立的,所以设计成子系统,各个子系统可以单独对外提供服务,现在在图书管理系统中,某一个同学需要借书,则需要在图书管理系统中添加一项该同学的借阅记录,但是学生的信息是存储在学生信息管理系统中的,所以图书管理系统需要向学生管理系统查询该学生的资料。由于两个子系统是相互独立的,所以图书管理系统访问学生管理系统其实是远程访问。

设计:支持远程访问只能通过网络报文的交互才能实现,为了方便其他的子系统使用学生信息,学生信息系统决定做一个代理类,调用方用该类来获取学生的资料信息就好像是在本地查询一样,使用该类让调用方无需知道数据从那里来,也无需知道如何实现,从样子上看就是从该类中得到了学生的信息。该类就是学生信息系统的代理(可以有多个代理),其他的子系统可以通过该类获取所有的学生信息。

类图:



实现:

struct STU_INFO

{

string name;

string age;

string classinfo;

}

//学生信息子系统的实现

class CStuInfo

{

public:

int GetInfo(STU_INFO& student)

{

......

}

}

======================

//图书管理系统的实现

class CStuInfoProxy

{

public:

int GetInfo(STU_INFO& student)

{

//发送网络报文到学生管理系统查询

send(send_buf);

recv(recv_buf);

parse(recv_buf);

student = ...;

}

}

通过上面的伪码可以看到,代理类提供了和真是的类相同的方法(也可以是功能),在实际编码中实在是太多。

操作系统对内存的操作就是代理模式的一种,因为所有的进程申请和释放的内存都并非是真是的物理内存,操作系统通过某种算法将物理内存和用户进程空间内存隔离,提供一个真是物理内存的代理(虚拟内存)来供用户申请。

总结:

代理模式是一个大的模式,因为它有很多的变种,远程代理只是一种。除此之外还有:

1、虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

2、Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

3、保护(Protector Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

4、Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

5、防火墙(Firewall)代理:保护目标,不让恶意用户接近。

6、同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

7、智能引用(SmartReference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(SmartReference Proxy)和保护(Protector Access)代理是最为常见的代理模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 c++