静态代理模式

What
静态代理模式(Proxy Pattern),简单了说,就是代为处理。很多文章说代理模式像“中介”,可以这么理解,但举得例子,例如买车例子,就让我与装饰者模式混肴了。其实静态代理做的,就只有简单的转发对象或者提供其他逻辑功能。
也就是说,设计一个代理类,这个代理类能代理被代理类,并提供更多的服务。
注意
1.代理也有可能是层层代理,也就是说,不止一个“中介”
2.与装饰者模式区别:代理模式可以说是增加功能,装饰者模式是增强功能。类似于:超人用代理模式增加影身功能,超人用装饰者模式增强镭射眼威力。

How
假设有一个人,正在跑步,另外一个人给其记录跑步时间:

//测试类
public class Test {public static void main(String []args) {Human human = new Human();Counter counter = new Counter(human);counter.run();}
}
interface Sport{void run();
}
//运动员跑步
class Human implements Sport{public void run(){System.out.println("Human run");}
}
//记录员记录
class Counter implements Sport{private Sport sport;public Counter ( Sport sport ){this.sport = sport;}public void run(){System.out.println("before run :" + System.currentTimeMillis());sport.run();System.out.println("after run :" + System.currentTimeMillis());}
}

运行结果:

before run :1574750981807
Human run
after run :1574750981809

以上展示的就是一个简单的静态代理,上面说了,可能不止一个代理类。那么按照上面的例子,我们再加一个,运动员跑步前要体检,跑步后也要体检,代码:

//测试类
public class Test {public static void main(String []args) {Human human = new Human();Counter counter = new Counter(human);MedicalStaff ms = new MedicalStaff(counter);ms.run();}
}
interface Sport{void run();
}
//运动员跑步
class Human implements Sport{public void run(){System.out.println("Human run");}
}
//记录员记录跑步时间
class Counter implements Sport{private Sport sport;public Counter ( Sport sport ){this.sport = sport;}public void run(){System.out.println("before run :" + System.currentTimeMillis());sport.run();System.out.println("after run :" + System.currentTimeMillis());}
}
//医务人员跑步体检
class MedicalStaff implements Sport{private Sport sport;public MedicalStaff( Sport sport ) {this.sport = sport;}public void run(){System.out.println("check body before run");sport.run();System.out.println("check body after run");}
}

运行结果

check body before run
before run :1574751683180
Human run
after run :1574751683182
check body after run

注意:
1.静态代理模式用到了java多态的特性;
2.静态代理模式类与类之间是一种组合的方式;
3.上面CounterMedicalStaff也可以调换位置,先计时再检查身体。。。。
4.注意Sport接口!!

接下来点一下静态代理与动态代理的区别:在动态代理中CounterMedicalStaff这两个类是由JVM动态为我们创建

动态代理的实现,请自行百度,有很多大神献出了代码!感恩~

When & Where
静态代理要了解的不多,用的也比较简单,主要就是动态代理,动态代理可以实现AOP(面向切面编程)面向切面编程可以在不改动源代码的情况下,给某一个或某一类方法,添加日志/事务/性能等等额外功能

说到这里,也点一下AOP的实现方式:
1:java实现:实现invocationHandle;
2:Spring AOP实现:实现MethodBeforeAdvice/AfterReturningAdvice/MethodInterceptor;
3:Spring Bean实现(基于XML配置);
4:AspectJ实现:Spring集成了AspectJ,很方便,用注解去开发;
5:CGLIB;

Syong :静态代理模式相关推荐

  1. 静态代理模式(多线程底部原理)

    静态代理模式总结(线程底部原理) 真实对象和代理对象都要实现同一个接口 代理对象要代理真实角色 好处: - 代理对象可以做很多真实对象做不了的事情 - 真实对象专注做自己的事情 创建静态代理模式:一个 ...

  2. 设计模式之静态代理模式实战

    转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...

  3. 使用静态代理模式实现公用的报表导出功能

    先聊一下什么是代理模式? 代理模式 给某个对象提供一个代理对象,并由代理独享控制对原对象的引用.什么意思呢?代理模式就有点像我们生活中常见的中介. 举个例子,我想买辆二手车,第一种方式是自己去找车源, ...

  4. Java多线程:静态代理模式

    静态代理模式 要求:有真实角色,代理角色 真实角色和代理角色要实现同一个接口 代理角色要持有真实角色的引用 设计静态代理模式 (1)必须有一个共同使用的接口 1 // 共同的接口 2 public i ...

  5. 浅谈java的静态代理模式

    嗨喽-小伙伴们XX好呀, 本章我们来介绍,java中出现的静态代理模式. 代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标 ...

  6. 多线程中的静态代理模式

    静态代理的例子: 1 /** 2 * 1.真实角色 3 * 2.代理角色 4 * 3.共同实现的接口 5 * @author tele 6 * 7 */ 8 public class StaticPr ...

  7. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  8. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  9. 接口(jdk1.8及之后) 单例模式(饿汉式,懒汉式) 静态代理模式 简单工厂模式 匿名内部类 lambda表达式

    接口: jdk1.8及之后新增了2种可以定义存在方法体的方法: 默认方法 (default关键字修饰的方法 ) 使用:通过实现类对象使用 静态方法 (掌握) 使用:通过接口名去调用 目前接口中: 必须 ...

  10. 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)

    静态代理: 角色分析: 抽象角色:一般使用接口或者是抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 以一个租房子的例子来 ...

最新文章

  1. php yii composer下载,composer的安装和下载yii
  2. python 1033 旧键盘打字 (20 分)
  3. 第一年的要求 工程系的研究生
  4. XCTF-Reverse:insanity
  5. Java是否为回文_java语言判断一个数字是否为回文数字
  6. 丢瓶盖(洛谷-P1316)
  7. html视频鼠标移除不播放,html - 在Mouseover上播放Gif并在鼠标移除时暂停Gif而不替换图像? - 堆栈内存溢出...
  8. jQuery Form 表单提交插件-----ajaxSubmit() 的应用
  9. Linux Socket C语言网络编程:TCP Socket
  10. javaweb(02) JavaScript基础知识
  11. Android Contentprovider的学习实例总结
  12. MD5校验判断文件是否一样
  13. Aandroid最简单最全面的热修复
  14. 【Vscode】解决报错 An SSH installation couldn‘t be found
  15. 玩转git之webhook应用初探
  16. 微信定向流量_我和我的小伙伴都玩微信定向流量了
  17. 植物大战僵尸2 服务器维护时间,植物大战僵尸2:老玩家给平民党的7点忠告,不氪金也能玩到通关!...
  18. oracle ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接
  19. STM32的USART_GetFlagStatus和USART_GetITStatus
  20. MATLAB中Simulink的模块封装

热门文章

  1. 2022-2028年中国工业级无人机行业市场全景调查及投资潜力研究报告
  2. bandicam的延迟问题和画质问题
  3. python爬虫轻松下载某易云音乐
  4. matlab 8750h,[多图]九代i7-9750H笔记本标压处理器与前代8750H性能对比
  5. 2018年湘潭大学程序设计竞赛 E 吃货
  6. 验证座机号码是否输入格式正确
  7. VS Code插件离线安装教程
  8. 关于Redis雪崩原因和解决方法终于搞懂了
  9. 3306端口被占用解决方式
  10. 基于JavaWeb开发的智慧水务管理系统软件设计说明书