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一样会进行处理,所以当接口中方法比较多时,我们又需要对该接口中的方法进行统一处理,则使用动态处理更为方便,复用性更强

最新文章

  1. linux shell脚本使用结构化命令
  2. 【CISP笔记】安全漏洞与恶意代码(2)
  3. C#中用schema验证xml的合法性
  4. 最常用的PHP正则表达式收集整理
  5. ural 1218. Episode N-th: The Jedi Tournament
  6. php-fpm 启动和关闭
  7. Hibernate一对多和多对一关系详解 (转载)
  8. 裸机编程与OS环境编程的有关思考
  9. AJAX 跨域
  10. VCS仿真 Dump Memory
  11. easyui-combobox默认值绑定
  12. zf-关于改绍兴县2个简单的BUG却需要ORACLE数据库的感慨
  13. webpack 引入 bootstrap
  14. ssh更改默认端口号及实现免密码远程登陆
  15. C# 将DataTable一行放入另一个DataTable中
  16. LeetCode 542. 01 Matrix
  17. G面经: Design Stock Price Display System
  18. springboot + schedule
  19. Hadoop源码系列(一)FairScheduler申请和分配container的过程
  20. 如何实现基于ssh框架的投票系统的的质量属性

热门文章

  1. Spring 讲解(二 )
  2. Hadoop(一)阿里云hadoop集群配置
  3. java基础学习笔记六(继承)
  4. 测试demo 配置
  5. HDU 6610 Game — 2019第三场杭电多校 1008题
  6. thinkphp5一键清除缓存
  7. Openstack组件部署 — Keystone功能介绍与认证实现流程
  8. eclispse指针变成十字型
  9. 执行sudo apt-get update报错
  10. mysql 日期和时间戳互换