Java学习路线-57:静态代理和动态代理
发布日期:2021-07-01 06:11:32
浏览次数:2
分类:技术文章
本文共 2409 字,大约阅读时间需要 8 分钟。
静态代理
角色分析
- 抽象角色 接口或者抽象类
- 真实角色 被代理的角色
- 代理角色 代理真实角色,一般会做一些附属操作
- 客户角色 使用代理角色进行一些操作
AbstractObject - RealObject - ProxyClient
代码实现
package com.pengshiyu.proxy;// 租借接口public interface IRent { void rent();}
package com.pengshiyu.proxy;public class Host implements IRent{ @Override public void rent() { System.out.println("房东租房"); }}
package com.pengshiyu.proxy;// 中介public class Proxy implements IRent{ private Host host; public Proxy(Host host){ this.host = host; } @Override public void rent() { this.beforeRent(); this.host.rent(); this.afterRent(); } private void beforeRent(){ System.out.println("中介带看房"); } private void afterRent(){ System.out.println("签订合同"); }}
package com.pengshiyu.proxy;// 客户public class Client { public static void main(String[] args) { Host host = new Host(); Proxy proxy = new Proxy(host); proxy.rent(); }}
使用静态代理
好处:
- 使得真实角色处理业务更加纯粹,不再关注公共的问题
- 公共业务由代理类完成,实现业务的分工
- 公共业务发生扩展时变得更加集中和方便
缺点
- 类多了,代理类,工作量变大,开发效率降低
动态代理
动态代理和静态代理的角色是一样的
动态代理的代理类是动态生成的
分类:
- 基于接口的动态代理 jdk 动态代理
- 基于类的动态代理 cglib、javasist
一个动态代理,一般代理某一类业务,可以代理多个类
package com.pengshiyu.proxy;public interface IVehicle { void run();}
package com.pengshiyu.proxy;public class Car implements IVehicle { public void run() { System.out.println("Car会跑"); }}
package com.pengshiyu.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class VehicleInvocationHandler implements InvocationHandler { private Object target; public VehicleInvocationHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---------before-------"); Object result = method.invoke(target, args); System.out.println("---------after-------"); return result; }}
package com.pengshiyu.proxy;import java.lang.reflect.Proxy;// 客户public class Client { public static void main(String[] args) { IVehicle car = new Car(); IVehicle carProxy = (IVehicle)Proxy.newProxyInstance( car.getClass().getClassLoader(), car.getClass().getInterfaces(), new VehicleInvocationHandler(car) ); carProxy.run(); }}
转载地址:https://pengshiyu.blog.csdn.net/article/details/106889171 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月02日 03时00分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
学习Three.js——网格(Mesh)
2019-05-05
学习Three.js——纹理(Texture)
2019-05-05
学习Three.js——材质(Material)
2019-05-05
学习Three.js——粒子、点云(Sprite,PointCloud)
2019-05-05
学习Three.js——光源(Light)
2019-05-05
学习Three.js——动画(Animation)
2019-05-05
学习Three.js——后期处理(EffectComposer)
2019-05-05
学习Three.js——添加物理效果(Physijs)
2019-05-05
学习Three.js——声音(Audio)
2019-05-05
CMake用法
2019-05-05
kmemleek检测工具原理及使用方法
2019-05-05
文章标题
2019-05-05
依靠注解来开发MyBatis并且使用CRUD
2019-05-05
MyBatis中动态SQL的使用
2019-05-05
MyBatis中缓存的使用
2019-05-05
Spring中的依赖注入(DI)
2019-05-05
Spring中bean的自动装配
2019-05-05
MyBatis和Spring的整合
2019-05-05
Spring中声明式事务
2019-05-05
原生js+css实现仿京东物流效果
2019-05-05