我们一定要会写的三种代理模式

代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。

目标:在eat方法执行的前后增加业务逻辑

准备工作

先准备三个基础类

public interface Person { void eat();}/** * 实现了Person接口 */public class OnePerson implements Person{ @Override public void eat() { System.out.println(“我吃饭了”); }}/** * 未实现任何接口 */public class User { public void eat(){ System.out.println(“用户正在吃饭”); }}

静态代理

优点:直观、简单、效率高

缺点:代理对象必须提前写出,如果接口层发生了变化,代理对象的代码也要进行维护

public class PersonProxy implements Person { private Person person; public PersonProxy(Person person) { this.person = person; } @Override public void eat() { System.out.println(“饭前先洗手”); this.person.eat(); System.out.println(“饭后百步走”); }}public class Demo { public static void main(String[] args) { Person person = new PersonProxy(new OnePerson()); person.eat(); }}

动态代理(也叫JDK代理)

缺点:至少包含一个接口

public class JDKDongTaiProxy { public static void main(String[] args) { Person target = new OnePerson(); Person person = (Person) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“饭前先洗手”); Object result = method.invoke(target, args); System.out.println(“饭后百步走”); return result; } }); person.eat(); }}

Cglib代理

缺点:依赖cglib包

public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(“饭前先洗手”); Object result = methodProxy.invokeSuper(o, objects); System.out.println(“饭后百步走”); return result; }}public class Demo { public static void main(String[] args) { // 没有实现接口 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(User.class); enhancer.setCallback(new MyMethodInterceptor()); User user = (User) enhancer.create(); user.eat(); // 实现了接口 enhancer = new Enhancer(); enhancer.setSuperclass(OnePerson.class); enhancer.setCallback(new MyMethodInterceptor()); Person person = (Person) enhancer.create(); person.eat(); }}

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月4日
下一篇 2022年7月4日

相关推荐

  • 一直在玩的孩子和不停上培训班的孩子以后会有什么不同?

    随着生存压力的不断加剧,大部分的家长逐渐的重视对孩子的教育问题,大都希望自己的孩子通过培训班的学习,能够夯实基础,力争上游;但是有的家长却不支持这种想法,认为孩子还小,不应该额外增…

    2022年8月19日
  • 教你几招,让孩子学习上瘾

    一、使孩子主动做功课 第一招,做作业的时间不宜过长。 第二招,放大孩子的优点。 第三招,学习不可操之过急。 第四招,先让孩子玩个够 第五招,刺激她,使他全力以赴。 第六招,学会反着…

    2022年8月25日
  • 在实践和架构演进中找到合适自己的路线和方向

    最近在读了《持续演进的Cloud Native-云原生架构下微服务最佳实践》这本书,大致内容是介绍了在云原生架构下无服务的最佳实践方式,书中详细介绍了架构的演进历史、云原生架构下微…

    2022年6月19日
  • 榨干GPU,AI存储进入200G IB时代

    AI存储,百亿空间 IDC预测,全球AI(人工智能)市场支出将在2021年达到850亿美元,并在2025年增至2,000亿美元,五年复合增长率(CAGR)约为24.5%。2025年…

    2022年6月16日
  • 中国“空天飞机”8月15日返回?事情并不简单,荷兰博士或搞错了

    一周前,我国“可重复使用试验航天器”在酒泉卫星发射中心点火发射升空。入轨这几天以来,该神秘航天器的一举一动备受中外的关注。那么,它究竟是什么呢?它又会在何时何地返回地球呢? 关于这…

    2022年8月17日
  • ​​旅行小伙伴

    这不,前段时间无意中看到了MRSHALL公众号的推文,一眼就相中了这款便携式音箱——Emberton II,机身小巧便携,长方体的箱体结构,看官方介绍说是机身仅重700克,可轻松置…

    2022年6月28日
  • 高质量人生哲理文案

    一、上帝很忙,每天要安排那么多人相遇,他没时间等你茁壮成长,也根本没心思听你的温言软语,那些出现在你生命里的人,抓住了,就是你的,自己放手了,也别可惜。 二、我们曾如此渴望命运的波…

    2022年8月13日
  • 基于Spring实现策略模式

    背景:   看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案;这个方案主要是看了一些开源rpc和Spring相关源码后的一些思…

    2022年6月18日
  • 扎心语录,句句入魂30

    #头号周刊# 1.生活就是这样,你有你的难,我有我的烦 ,各有各的苦。时间在走,年龄在长,懂得多了,看透的也就多了。不得不承认,时间改变了很多… 2.人怕走错路,心怕给错人。掏心掏…

    2022年8月26日
  • iOS16保资料降级卡开机LOGO,教你成功修复白苹果退回iOS15

    自上周2022全球开发者大会发布iOS16、iPadOS16后,果粉都被新增加的自定义锁屏、相册一键抠图、信息实时编辑与撤回等功能所吸引,尝鲜派早早已经升级到iOS16beta版本…

    2022年6月15日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息