实现动态代理设计模式

动态代理设计模式的最大特点是可以同时为若干个功能相近的类提供统一的代理支持,这就必须要定义一个公共的代理类,在java中针对此动态代理提供了一个公共的标准接口InvocationHandler

public interface InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

proxy:代理对象
method: 要执行的目标类方法
args: 执行方法所需要的参数

除了提供统一的代理操作类外,还需要在类运行中依据被代理类所实现的父接口动态的创建一个临时的代理对象,而这一操作就可以通过Proxy类来实现;
创建代理对象:

 public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
package com.cn;

public interface Imessage {
    public void send();
}
package com.cn;

public class MessageReal implements Imessage {
    @Override
    public void send() {
        System.out.println("[发送消息]===================");
    }
}
package com.cn;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MLDNProxy implements InvocationHandler {
    private Object target;

    public Object bind(Object target){
        this.target=target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }
    public boolean connect(){
        System.out.println("[消息代理] 进行消息发送通道的链接");
        return true;
    }

    public void close(){
        System.out.println("[消息代理] 关闭消息通道");
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object returnData=null;
        if (this.connect()){
            returnData = method.invoke(this.target,args);
            this.close();
        }
        return returnData;
    }
}
package com.cn;

public class JavaReflectDemo {
    public static void main(String[] args) {
        Imessage imessage =(Imessage) new MLDNProxy().bind(new MessageReal());
        imessage.send();
    }

利用InvocationHandler接口定义了一个代理类,该代理类不会与任何接口有耦合关联,并且所以的代理对象都是通过Proxy根据真实对象的结构动态创建而来,由于动态代理类具有通用性的特点,所以每当用户调用方法时都会执行代理类中的invoke方法,该方法将通过反射的形式调用真实的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值