For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
设计模式的学习与应用是每一位Java编程开发程序员都应该熟练掌握的一个编程知识点,而本文我们就通过案例分析来简单了解一下,代理模式与装饰模式的概念分享。
一、代理模式(ProxyPattern)
代理模式为一个对象提供一种代理以控制对该对象的访问,它是一个使用率非常高的设计模式,即使在现实生活中,也是很常见,比如演唱会门票黄牛。假设你需要看一场演唱会,但是官网上门票已经售罄,于是就当天到现场通过黄牛高价买了一张。在这个例子中,黄牛就相当于演唱会门票的代理,在正式渠道无法购买门票的情况下,你通过代理完成了该目标。
从演唱会门票的例子我们也可以看出,使用代理模式的关键在于当Client不方便直接访问一个对象时,提供一个代理对象控制该对象的访问。Client实际上访问的是代理对象,代理对象会将Client的请求转给本体对象去处理。
在程序设计中,代理模式也分为好几种:
1、远程代理(remoteproxy),远程代理适用于提供服务的对象处在远程的机器上,通过普通的函数调用无法使用服务,需要经过远程代理来完成。因为并不能直接访问本体对象,所有远程代理对象通常不会直接持有本体对象的引用,而是持有远端机器的地址,通过网络协议去访问本体对象。
2、虚拟代理(virtualproxy),在程序设计中常常会有一些重量级的服务对象,如果一直持有该对象实例会非常消耗系统资源,这时可以通过虚拟代理来对该对象进行延迟初始化。
3、保护代理(protectionproxy),保护代理用于控制对本体对象的访问,常用于需要给Client的访问加上权限验证的场景。
4、缓存代理(cacheproxy),缓存代理主要在Client与本体对象之间加上一层缓存,用于加速本体对象的访问,常见于连接数据库的场景。
5、智能引用(smartreference),智能引用为本体对象的访问提供了额外的动作,常见的实现为C++中的智能指针,为对象的访问提供了计数功能,当访问对象的计数为0时销毁该对象。
二、装饰模式(DecoratorPattern)
在程序设计中,我们常常需要为对象添加新的行为,很多同学的一个想法就是扩展本体对象,通过继承的方式达到目的。但是使用继承不可避免地有如下两个弊端:(1)继承时静态的,在编译期间就已经确定,无法在运行时改变对象的行为。(2)子类只能有一个父类,当需要添加的新功能太多时,容易导致类的数量剧增。
对于这种场景,我们通常会使用装饰模式(DecoratorPattern)来解决,它使用组合而非继承的方式,能够动态地为本体对象叠加新的行为。理论上,只要没有限制,它可以一直把功能叠加下去。装饰模式的应用当属Java的I/O流体系,通过装饰模式,使用者可以动态地为原始的输入输出流添加功能,比如按照字符串输入输出,添加缓存等,使得整个I/O流体系具有很高的可扩展性和灵活性。
从结构上看,装饰模式和代理模式具有很高的相似性,但是两种所强调的点不一样。前者强调的是为本体对象添加新的功能,后者强调的是对本体对象的访问控制。当然,代理模式中的智能引用在笔者看来就跟装饰模式完全一样了。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。