动态代理设计模式

静态代理设计模式由于采用硬编码的形式,代理类不具备通用性,这样就会造成大量的重复代码,为了得到统一的代理支持可以基于动态代理设计模式完成。
代码实现如下:

package com.uk.demo;

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

interface IMessage{
    public void send();
}

class MessageReal implements IMessage{
    @Override
    public void send() {
        System.out.println("【消息发送】www.dynamicproxy.com");
    }
}

class DynProxy implements InvocationHandler{
    private Object target;
    /**
     * 进行真实业务对象与代理业务对象之间的绑定处理
     * @param target 真实业务对象
     * @return Proxy生成的代理业务对象
     */
    public Object bind(Object target) {
        this.target = target;
        //依据真实对象的类加载器、实现接口以及代理调用类(InvocationHandler子类)动态创建代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    public boolean connect() {
        System.out.println("【消息代理】进行消息发送通道的连接。");
        return true;
    }
    public void close() {//代理方法
        System.out.println("【消息代理】关闭消息通道。");
    }
    public Object invoke(Object pro, Method method, Object[] args) throws Throwable{
        Object retData = null;                            //真实业务处理结果
        if(this.connect()) {                            //通道是否连接
            retData = method.invoke(this.target, args); //调用真实业务
            this.close();                                //通道关闭
        }
        return retData;                                    //返回执行结果
    }
}

public class DynamicProxy {
    public static void main(String[] args) {
        IMessage msg = (IMessage) new DynProxy().bind(new MessageReal());
        msg.send();
    }
}

运行结果:

【消息代理】进行消息发送通道的连接。
【消息发送】www.dynamicproxy.com
【消息代理】关闭消息通道。

 

posted @ 2019-07-22 09:29  逍遥天地间  阅读(150)  评论(0编辑  收藏  举报