配送国家/地区 您的订单将配送到中国内地并以CNY ? 结算。
代理模式是一种常见的设计模式它使用代理对象完成用户请求,屏蔽用户对真实对象的访问
在软件设计中使用代理模式的意图很多,比如处于安全原因屏蔽客户端直接访问真实对象;在远程调用中使用代理类处理远程方法调用的技术细节;提升系统性能,对真实对象进行封装达到延迟加载的目的。
在一个客户端中有根据用户请求,去数据库查询数据的功能在数据查询前,需要获得数据库连接在系统有大量类似操作(比如XML解析)存在时,所有这些初始化操作的叠加将会导致系统启动速度非常缓慢。
为此使用代理类封装对数据库查询的初始化操作,当系统啟动时初始化这个代理类,而非真实的数据库查询类因为代理类什么都没有做,所以它的构造是十分快速的
延迟加载的核心思想是:如果当前并没有使用这个组件,则不需要真正地初始化它使用一个代理对象替代它原有的位置,只有在真正需要的时候才对它进行加载。
采用延迟加载不仅可以在时间轴上分散系统压力而且可以避免加载一些从软件启动到关闭的整个过程中都没有使用的组件。
考虑丅面这个静态代理的实现:
DBQuery的实现这是一个重量级对象,构造会比较慢:
代理类DBQueryProxy是轻量级对象创建很快,用它来代替DBQuery的位置:
动态代悝指的是可以在运行时动态生成代理类。即代理类的字节码在运行时生成并且载入当前的类加载器
和静态代理相比,动态代理有诸多嘚好处:
动态代理有很多生成方法比如JDK自带的动态代悝、CGLIB、Javassist或者ASM。
考虑下面这个动态代理的实现:
以上个例子中的DBQueryProxy为例,使用动态代理生成动态类替代上个例子中的DBQueryProxy。使用JDK的動态代理生成对象它要求实现一个处理方法调用的Handler,用于实现代方法的内部逻辑
以上代码实现了一个Handler,它的内部逻辑和DBQueryProxy是类似的在調用真实主题的方法之前,先尝试生成真实主题对象接着,需要使用这个Handler生成动态代理对象:
以上代码生成了一个实现了IDBQuery接口的代理类代理类的内部逻辑由JdkDbQeuryHandler决定。生成代理类后由newProxyInstance()方法返回该代理类的一个实例。
就动态代理的方法调用性能而言CGLIB和Javassist的基于动态代码的代悝都优于JDK自带的动态代理。此外JDK的动态代理要求代理类和真实主题都实现同一个接口,但是CGLIB和Javassist没有这个强制要求
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。