Syong :静态代理模式
静态代理模式
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.上面Counter
与MedicalStaff
也可以调换位置,先计时再检查身体。。。。
4.注意Sport接口!!
接下来点一下静态代理与动态代理的区别:在动态代理中Counter
与MedicalStaff
这两个类是由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 :静态代理模式相关推荐
- 静态代理模式(多线程底部原理)
静态代理模式总结(线程底部原理) 真实对象和代理对象都要实现同一个接口 代理对象要代理真实角色 好处: - 代理对象可以做很多真实对象做不了的事情 - 真实对象专注做自己的事情 创建静态代理模式:一个 ...
- 设计模式之静态代理模式实战
转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...
- 使用静态代理模式实现公用的报表导出功能
先聊一下什么是代理模式? 代理模式 给某个对象提供一个代理对象,并由代理独享控制对原对象的引用.什么意思呢?代理模式就有点像我们生活中常见的中介. 举个例子,我想买辆二手车,第一种方式是自己去找车源, ...
- Java多线程:静态代理模式
静态代理模式 要求:有真实角色,代理角色 真实角色和代理角色要实现同一个接口 代理角色要持有真实角色的引用 设计静态代理模式 (1)必须有一个共同使用的接口 1 // 共同的接口 2 public i ...
- 浅谈java的静态代理模式
嗨喽-小伙伴们XX好呀, 本章我们来介绍,java中出现的静态代理模式. 代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标 ...
- 多线程中的静态代理模式
静态代理的例子: 1 /** 2 * 1.真实角色 3 * 2.代理角色 4 * 3.共同实现的接口 5 * @author tele 6 * 7 */ 8 public class StaticPr ...
- 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式
文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...
- 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...
- 接口(jdk1.8及之后) 单例模式(饿汉式,懒汉式) 静态代理模式 简单工厂模式 匿名内部类 lambda表达式
接口: jdk1.8及之后新增了2种可以定义存在方法体的方法: 默认方法 (default关键字修饰的方法 ) 使用:通过实现类对象使用 静态方法 (掌握) 使用:通过接口名去调用 目前接口中: 必须 ...
- 小白都能懂的设计模式 java版 静态代理模式实战练习(超详细)
静态代理: 角色分析: 抽象角色:一般使用接口或者是抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 以一个租房子的例子来 ...
最新文章
- php yii composer下载,composer的安装和下载yii
- python 1033 旧键盘打字 (20 分)
- 第一年的要求 工程系的研究生
- XCTF-Reverse:insanity
- Java是否为回文_java语言判断一个数字是否为回文数字
- 丢瓶盖(洛谷-P1316)
- html视频鼠标移除不播放,html - 在Mouseover上播放Gif并在鼠标移除时暂停Gif而不替换图像? - 堆栈内存溢出...
- jQuery Form 表单提交插件-----ajaxSubmit() 的应用
- Linux Socket C语言网络编程:TCP Socket
- javaweb(02) JavaScript基础知识
- Android Contentprovider的学习实例总结
- MD5校验判断文件是否一样
- Aandroid最简单最全面的热修复
- 【Vscode】解决报错 An SSH installation couldn‘t be found
- 玩转git之webhook应用初探
- 微信定向流量_我和我的小伙伴都玩微信定向流量了
- 植物大战僵尸2 服务器维护时间,植物大战僵尸2:老玩家给平民党的7点忠告,不氪金也能玩到通关!...
- oracle ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接
- STM32的USART_GetFlagStatus和USART_GetITStatus
- MATLAB中Simulink的模块封装