静态代理模式详解

代理模式,可以分为两种,一种是静态代理,一种是动态代理。
两种代理从虚拟机加载类的角度来讲,本质上都是一样的,都是在原有类的行为基础上,加入一些多出的行为,甚至完全替换原有的行为。

静态代理采用的方式就是我们手动的将这些行为换进去,然后让编译器帮我们编译,同时也就将字节码在原有类的基础上加入一些其他的东西或者替换原有的东西,产生一个新的与原有类接口相同却行为不同的类型,而动态代理?

我们都知道,数据库连接是很珍贵的资源,频繁的开关数据库连接是非常浪费服务器的CPU资源以及内存的,所以我们一般都是使用数据库连接池来解决这一问题,即创造一堆等待被使用的连接,等到用的时候就从池里取一个,不用了再放回去,数据库连接在整个应用启动期间,几乎是不关闭的,除非是超过了最大闲置时间。

但是在程序员编写程序的时候,会经常使用connection.close()这样的方法,去关闭数据库连接,而且这样做是对的,所以你并不能告诉程序员们说,你们使用连接都不要关了,去调用一个其他的类似归还给连接池的方法吧。这是不符合程序员的编程思维的,也很勉强,而且具有风险性,因为程序员会忘的。
解决这一问题的办法就是使用代理模式,因为代理模式可以替代原有类的行为,所以我们要做的就是替换掉connection的close行为。

QQ图片20171101145712.png

这里只贴了两个方法,但是我们代理的精髓只要两个方法就能掌握,下面使用静态代理,采用静态代理我们通常会使用组合的方式,为了保持对程序猿是透明的,我们实现Connection这个接口, 如下所示。

QQ图片20171101145831.png

main方法:

QQ图片20171101175104.png

我们使用代理模式解决了上述问题,从静态代理的使用上来看,我们一般是这么做的。

      1,代理类一般要持有一个被代理的对象的引用。

      2,对于我们不关心的方法,全部委托给被代理的对象处理。

      3,自己处理我们关心的方法。

静态代理的优缺点
优点:
1.代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合)
2.业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1.代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
2.代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。如上的代码是只为UserManager类的访问提供了代理,但是如果还要为其他类如Department类提供代理的话,就需要我们再次添加代理Department的代理类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,241评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,843评论 25 709
  • 君临天下 九五之尊下凡尘, 体察民间为己任, 恩泽雨露均点滴, 造福八方转大运。 拒融冰心 雪山之巅藏精灵, 晶莹...
    笔探花阅读 2,629评论 0 0
  • 阴阳者,天地之枢机;五行者,阴阳之终始。 故人者成于天地,败于阴阳,由五行从逆而生焉。 金生水、水生木、木生火、火...
    天一书社阅读 2,905评论 0 0
  • 「任何一只害鸟不会弄脏自己的窝巢。」 01 大学毕业三年,班级微信群很少响了,偶尔响一下,是某某买房了,晒几张新家...
    劉詩詩阅读 1,868评论 0 1

友情链接更多精彩内容