您的位置:首页 > 其它

白话设计模式--结构型模式--享元模式和代理模式

2008-12-27 13:07 507 查看
很久没有写了,这段时间事情比较多,心情也不是特别愉快,所以学习都停滞了。昨天给我妈打了个电话,心情一下子好多了,决定要重新振作喽,呵呵 写的不好请大家多多包含啊 要是能给大家一点儿启发那我就高兴死了,如果没有也请大家轻点儿拍砖,希望和大家共同进步。

谈起享元模式,可能大家都是听说过没怎么用过。确实,它更多的关注的是对系统性能的优化,减少对象内存占用量。主要做法就是把那些对象之间共享的部分抽取出来,在调用对象时只需要移动指针而不用再重新创建重复的对象。

需要注意的是:

当共享对象小于一个指针的大小时,没必要了( 比如 char,2 bytes)。

dotnet中字符串本身应用了享元模式(相同字符串只有一个实际存在,其它都是指针指的)。享元模式解决的问题是对象代价的问题,基本不存在抽象性问题。采用的是对象共享的做法来降低大量的小对象对系统造成的压力。

而代理模式相对来说就应用的比较广了,不,确切的说是非常的广。它其实就是增加一个中间层,把对象之间的直接访问变成间接访问。

人,操作系统和硬件就是一个最简单的例子,操作系统就是硬件的代理,人通过操作系统这个代理访问硬件并完成任务。操作系统以及各种软件都是代理。

那在什么情况下才要用代理呢?比如说,人要直接和硬件交互,那就太麻烦了,增加了复杂性,所以在直接访问过于复杂,开销很大或者其它方面给我们带来很多麻烦的时候,就用代理模式。代理模式就是屏蔽管理一些复杂性。

在实际情况中,代理模式大多应用于分布式的系统中不同位置的对象之间的交互,这里的不同位置可能是不同机器或者跨internet,比如webservice;访问控制,比如安全控制,缓存控制;屏蔽一些实现细节,比如数据访问等等。

代理模式不难理解,难点在于实现细节。在实现过程中,可能用到soap,http等网络协议,对于XML的操作以及一些其它方面的技术。在代理调用真正对象的过程中,会有很大的弹性空间,而不仅仅是代理直接调用真对象。如果直接调用的话,代理模式就失去其意义了。

在C#中,最典型的例子就是stringbuilder,它就是一个代理(它使用了copy-on-write技术对字符串进行了处理,节省了内存,效率比较高--copy-on-write指的是只有在字符串发生改变的时候才重新copy一次然后再更改),stringbuilder这个代理就使用了copy-on-write技术对字符串进行控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: