代理模式
2015-06-08 09:38
197 查看
使用代理对象完成用户请求,屏蔽用户对真实对象的访问。
在软件设计中,使用代理模式的意图很多,比如,因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节(RMI),也可能为了提供性能,对真实对象进行封装,进而达到延迟加载的目的。
延迟加载:
假设某客户端软件有根据用户请求去数据库查询数据的功能。在查询数据前,需要获得数据库连接,软件开启时初始化系统的所有类,此时尝试获得数据库连接。当系统有大量的类似操作存在时 (比如 XML 解析等),所有这些初始化操作的叠加会使得系统的启动速度变得非常缓慢。为此,使用代理模式的代理类封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非真实的数据库查询类,而代理类什么都没有做。因此,它的构造是相当迅速的。
在系统启动时,将消耗资源最多的方法都使用代理模式分离,可以加快系统的启动速度,减少用户的等待时间。而在用户真正做查询操作时再由代理类单独去加载真实的数据库查询类,完成用户的请求。这个过程就是使用代理模式实现了延迟加载。
延迟加载的核心思想:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理对象替代它原有的位置,只要在真正需要的时候才对它进行加载。
代理模式角色分为4种:
主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法
真实主题:真正实现业务逻辑的类
代理类:用来代理和封装真实主题
Main:客户端,使用代理类和主题接口完成一些工作。
动态代理:
是指在运行时动态生成代理类。即代理类的字节码将在运行时生成并载入当前代理的ClassLoader。
不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦。如果接口有变动,则真实主题和代理类都要修改。
使用动态代理的生成方法甚至可以在运行时定制代理类的执行逻辑。
动态代理类使用字节码动态生成加载技术,在运行时生成加载类。生成动态代理类的方法有很多,JDK自带的动态代理,CGLIB,Javassist或者ASM库
在软件设计中,使用代理模式的意图很多,比如,因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节(RMI),也可能为了提供性能,对真实对象进行封装,进而达到延迟加载的目的。
延迟加载:
假设某客户端软件有根据用户请求去数据库查询数据的功能。在查询数据前,需要获得数据库连接,软件开启时初始化系统的所有类,此时尝试获得数据库连接。当系统有大量的类似操作存在时 (比如 XML 解析等),所有这些初始化操作的叠加会使得系统的启动速度变得非常缓慢。为此,使用代理模式的代理类封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非真实的数据库查询类,而代理类什么都没有做。因此,它的构造是相当迅速的。
在系统启动时,将消耗资源最多的方法都使用代理模式分离,可以加快系统的启动速度,减少用户的等待时间。而在用户真正做查询操作时再由代理类单独去加载真实的数据库查询类,完成用户的请求。这个过程就是使用代理模式实现了延迟加载。
延迟加载的核心思想:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理对象替代它原有的位置,只要在真正需要的时候才对它进行加载。
代理模式角色分为4种:
主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法
真实主题:真正实现业务逻辑的类
代理类:用来代理和封装真实主题
Main:客户端,使用代理类和主题接口完成一些工作。
动态代理:
是指在运行时动态生成代理类。即代理类的字节码将在运行时生成并载入当前代理的ClassLoader。
不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦。如果接口有变动,则真实主题和代理类都要修改。
使用动态代理的生成方法甚至可以在运行时定制代理类的执行逻辑。
动态代理类使用字节码动态生成加载技术,在运行时生成加载类。生成动态代理类的方法有很多,JDK自带的动态代理,CGLIB,Javassist或者ASM库
相关文章推荐
- Linux ACL权限
- java QQ客户端
- GO语言系列【连载GoRK3288】1.Rockchip RK3288, GO!GO!!GO!!!
- CSS 选择符
- Microsoft.Office.Interop.Word 创建word
- STL 排序算法之全排列sort和next_permutation
- php配置打开短标签
- QLPreviewController 展示TXT文本时中文乱码的解决方法
- HTML5: Screen Orientation API
- leetcode_64题——Minimum Path Sum(动态规划)
- .NET开源项目
- 模仿登陆,记住密码
- POJ 1003
- Android 解决系统大号字体导致布局显示错乱问题
- MySQL 数据库 数据表 编辑
- win7系统管理员被禁用了怎么办
- Java对象及内存管理
- 详细整理:UITableView优化技巧
- 新工作
- Eclipse for Mac 常用快捷键