java设计模式--代理及其动态代理--05

本文介绍如何使用Java代理模式实现对象功能的动态扩展,通过创建代理类和操作者类,实现对目标对象的功能增强,如日志记录功能。通过代理对象和操作者之间的解耦,实现了功能的灵活添加和移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特点:许多解决解决问题的方法中的共同点提取出来。实现时利用java api的代理类实现,需要对工具类进行学习。
实际情况:需要对某个对象或一组对象,进行功能扩展,动态增加和取消特定功能。如日志记录功能。
优点是:把我们的代理对象和被代理对象解藕,代理者和操作者解藕。
缺点:
实现:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public interface IOperation {
<wbr><wbr><wbr><br><wbr><wbr><wbr> void start(Method method);<br><wbr><wbr><wbr><br><wbr><wbr><wbr> void end(Method method);<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

实现上面接口的类.生成一个真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
package sinosoft.dj.aop.proxyaop;

import java.lang.reflect.Method;

public class LoggerOperation implements IOperation {

<wbr><wbr><wbr> public void end(Method method) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Logger.logging(Level.DEBUGE, method.getName() + " Method end .");<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> public void start(Method method) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Logger.logging(Level.INFO, method.getName() + " Method Start!");<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

}

然后我们要改一下代理对象DynaProxyHello中的代码.如下:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynaProxyHello implements InvocationHandler {
<wbr><wbr><wbr><br><wbr><wbr><wbr> private Object proxy;<br><wbr><wbr><wbr><br><wbr><wbr><wbr><br><wbr><wbr><wbr> private Object delegate;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr>//这个band的方法参数有几个有没有约定?<wbr><br><wbr><wbr><wbr> public Object bind(Object delegate,Object proxy) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.proxy = proxy;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.delegate = delegate;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return Proxy.newProxyInstance(<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.delegate.getClass().getClassLoader(), this.delegate<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> .getClass().getInterfaces(), this);<br><wbr><wbr><wbr> }<br><wbr><wbr><wbr><br><wbr><wbr><wbr> public Object invoke(Object proxy, Method method, Object[] args)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> throws Throwable {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Object result = null;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> try {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射得到操作者的实例<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Class clazz = this.proxy.getClass();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射得到操作者的Start方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Method start = clazz.getDeclaredMethod("start",<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> new Class[] { Method.class });<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射执行start方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> start.invoke(this.proxy, new Object[] { method });<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //执行要处理对象的原本方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> result = method.invoke(this.delegate, args);<br> //<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 反射得到操作者的end方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Method end = clazz.getDeclaredMethod("end",<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值