1.接口
public interface Channel { void send(); }
2.实现类(可以为各种不同实现)
public class ChannelImpl implements Channel { @Override public void send() { System.out.println("send Message"); } }
3.静态代理:代理类
public class ChannelProxy implements Channel{ //代理对象 Channel channel; //传入代理对象 public ChannelProxy(Channel channel){ this.channel = channel; } @Override public void send() { System.out.println("start send message"); channel.send(); System.out.println("end send message"); } }
3.动态代理:代理类
/**创建代理实现InvocationHandler*/ public class MyHandler implements InvocationHandler { /** * 目标对象 */ Object target; public MyHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start send message"); System.out.println("调用目标对象:"+target.getClass()+",目标方法:"+method.getName()); Object result = method.invoke(target); System.out.println("end send message"); return result; } }
4.调用
public class ProxyTest { public static void main(String [] args){ System.out.println("=================静态代理==================="); Channel channel = new ChannelImpl(); ChannelProxy channelProxy = new ChannelProxy(channel); channelProxy.send(); System.out.println("=================动态代理==================="); MyHandler myHandler = new MyHandler(channel); Channel target = (Channel)(Proxy.newProxyInstance(channel.getClass().getClassLoader(),channel.getClass().getInterfaces(), myHandler)); target.send(); } }
5.结果
=================静态代理=================== start send message send Message end send message =================动态代理=================== start send message 调用目标对象:class proxy.ChannelImpl,目标方法:send send Message end send message
比较:
静态代理:
代理类不用关心具体哪个实现类及如何实现send方法,调用时只需要代理类即可,解耦.但是代理类及实现类需全部实现接口,若添加接口,则代理类与实现类均需添加,代码冗余,且改代理类只能代理该一个接口,若需要代理其他接口,则需要创建新的代理类
动态代理:
在静态代理基础上,去除了静态代理的冗余,无需实现指定的接口,任何接口均可代理,若接口Channel还有其他方法如create()方法,则MyHandler的invoke一样会进行处理,所以当接口中方法比较多时,我们又需要对该接口中的方法进行统一处理,则使用动态处理更为方便,复用性更强