网站首页 > java教程 正文
1.代理模式很好地将两个直接关联的类进行了解耦,并且还可以在代理类中添加额外的代码,以进行特殊的处理,如果不采用代理模式,当两个类关联式,就需要再代码中直接调用另一个类B,这样如果需要添加一些特殊的处理,就通用要直接写在某一个类A的代码中,当有很多类都需要这些特殊处理时,每个类都必须编写相应的特殊处理的代码,就不能进行代码的复用,采用代理模式就能避免这些问题。
在程序开发过程中,经常会遇到一些和具体的业务逻辑无关的代码控制,如日志,权限,事务处理等,每段代码都添加日志或权限,事务处理的代码,程序编写起来会很麻烦,如果能有一个代理类,统一进行额外的处理,就可以放更多精力在业务逻辑代码中了。
代理模式的关键点:代理对象与目标对象。代理对象是对目标对象的扩展,并会调用目标对象。
代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用。代理模式主要由3部分组成:抽象目标类,具体目标类和代理类。
2.静态代理
静态代理由我们自己去生成的固定的代码进行编译。需要定义接口或者抽象的父类作为抽象目标类,具体目标类和代理类一起实现相同的接口或者是继承相同的类,然后通过调用相同的方法来调用目标对象的方法。
代码示例:
2.1)抽象目标类
java
2.2 )具体目标类,即被代理对象
java
2.3)代理类
java
测试类
java
运行结果:
开始事务。。。 ==已经保存数据啦提交事务。。。
静态代理可以在不修改目标对象的功能前提下,对目标功能进行扩展。
缺点是:
因为代理对象需要与目标对象实现一样的接口,所以会有很多的代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。
解决此缺点的方法就是可以使用动态代理方式
3.动态代理
动态代理模式:在程序运行期间动态生成代理类。spring的aop面向切面编程就是使用动态代理模式来实现的。
JVM可以自己创建代理类,这样不仅提高了效率,而且更灵活。动态代理的3个主要的类:
proxy类、InvocationHandler、Method
通过proxy类和InvocationHandler接口可以生成JDK动态代理类和动态代理对象。
对于代理的接口的实际处理,是一个java.lang.reflect.InvocationHandler,它提供了一个invoke方法供实现者提供相应的代理逻辑的实现。可以兑实际的实现进行一些特殊的处理,像spring aop中的各种Adevice.
Proxy类中主要有3个方法:
java
每个代理实例都必须指定一个调用处理器,代理对象调用方法时,该方法会指派到调用处理器的invoke()中去。代理的方法封装成invoke中的method对象,其中的参数封装成Object[].
动态代理实现的步骤:
1)写一个代理类实现InvocationHandler接口,通过构造函数把代理对象(具体目标类)传入到此处理器中,在invoke方法中增加method.invoke(realSubject,args)。
2)在调用方法时,通过java.lang.reflect.Proxy的newProxyInstance来获取代理实现类,生成代理对象时,直接调用方法即可。
代码示例:
3.1)被代理的接口
java
3.2)具体实现类,被代理对象
java
3.3)动态代理类
java
3.4)调用
java
运行结果:
处理业务逻辑之前。 进行业务逻辑的处理 处理业务逻辑之后。Process finished with exit code 0
- 上一篇: java 代理模式(java代理模式)
- 下一篇: Java代理模式详解(java的代理模式)
猜你喜欢
- 2024-10-24 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-24 Java 设计模式 之 代理模式 (1)(java设计模式之代理模式)
- 2024-10-24 Java设计模式:代理模式 vs. 装饰模式
- 2024-10-24 设计模式篇——代理模式详解(面试再问你代理模式,这么回答他)
- 2024-10-24 动态代理大揭秘,带你彻底弄清楚动态代理
- 2024-10-24 面试:Java的代理模式动态代理和静态代理区别,aop用的什么代理
- 2024-10-24 Java设计模式之代理模式(java代理类是什么)
- 2024-10-24 JAVA设计模式——代理模式(java编写代理服务)
- 2024-10-24 23种java设计模式之:门面模式、享元模式、代理模式
- 2024-10-24 Java 17中的动态代理:实现灵活的代理模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)