Aha!设计模式(71)-代理模式(5)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/craftsman1970/article/details/89477290

效果

代理模式在保证满足利用者的基本需求的前提下引入了一定的调整空间。所谓的调整可以是处理内容的增减或者处理时机的变化。通过这种调整来满足额外的需求。

RemoteProxy增加了进程间甚至是设备间的通信,这样无论对象是否处于相同进程、线程还是设备,都可以以相同的方式进行访问。

VirtualProxy调整了实际生成对象的时机,只在对象真正必要的时候才会在内存中进行构建,从而最大限度地节约了空间。

ProtectionProxy增加了登录或者认证处理,在不改变被代理对象的前提下,实现了访问控制。

无论哪种调整,核心的功能都是不变的。

实现

GOF book中还提到了CopyOnWrite的例子,大概的意思是在对象的内容没有修改的时候共享一个对象,当需要修改对象的内容时再构建独立的对象。

一般来讲,每个实例都需要管理独立的数据,以便各自修改数据的内容。例如下面的代码:

代码在构建Client实例时,每次都需要拷贝一个subject对象作为自己的数据成员。否则的话,所有的实例使用的都是同一个subject。以下是执行结果,分别表示对象创建和一个实例被修改之后的状态。

从程序代码的执行结果可以看到:即使内容都是同样的ABCD,也需要不同的对象来管理,因为接下来需要分别设定每个实例的内容。但是这种方法存在一个问题,那就是当对象大量存在的时候,总会有一些对象不需要修改内容。为了节约这部分内容重复的内存空间,下面的代码使用代理模式。

首先,将Subject类的内容转移到RealSubJect中,Subject只保留定义接口的功能;然后增加一个Proxy类,只在数据发生修改时才会生成subject的拷贝。以下是执行结果:

可以看到,当内容相同时,使用相同的对象,当内容不同时,则使用不同的对象。通过代理模式,一方面节约了内容相同时额外占用的内存空间,另一方面也实现了内容不同时的独立管理。重要的是,这些都是在Client不需要意识的情况下完成的。

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/89477290