您的位置:首页 > 其它

代理模式

2015-06-08 09:38 197 查看
使用代理对象完成用户请求,屏蔽用户对真实对象的访问。

在软件设计中,使用代理模式的意图很多,比如,因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节(RMI),也可能为了提供性能,对真实对象进行封装,进而达到延迟加载的目的。

延迟加载:

假设某客户端软件有根据用户请求去数据库查询数据的功能。在查询数据前,需要获得数据库连接,软件开启时初始化系统的所有类,此时尝试获得数据库连接。当系统有大量的类似操作存在时 (比如 XML 解析等),所有这些初始化操作的叠加会使得系统的启动速度变得非常缓慢。为此,使用代理模式的代理类封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非真实的数据库查询类,而代理类什么都没有做。因此,它的构造是相当迅速的。

在系统启动时,将消耗资源最多的方法都使用代理模式分离,可以加快系统的启动速度,减少用户的等待时间。而在用户真正做查询操作时再由代理类单独去加载真实的数据库查询类,完成用户的请求。这个过程就是使用代理模式实现了延迟加载。

延迟加载的核心思想:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理对象替代它原有的位置,只要在真正需要的时候才对它进行加载。

代理模式角色分为4种:

主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法

真实主题:真正实现业务逻辑的类

代理类:用来代理和封装真实主题

Main:客户端,使用代理类和主题接口完成一些工作。

动态代理:

是指在运行时动态生成代理类。即代理类的字节码将在运行时生成并载入当前代理的ClassLoader。

不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦。如果接口有变动,则真实主题和代理类都要修改。

使用动态代理的生成方法甚至可以在运行时定制代理类的执行逻辑。

动态代理类使用字节码动态生成加载技术,在运行时生成加载类。生成动态代理类的方法有很多,JDK自带的动态代理,CGLIB,Javassist或者ASM库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: