Java:详谈设计模式之---代理模式(让你简单弄懂代理)

打败自己的从来不是困难,而是懒惰!!!

1.代理模式介绍

高级讲法:代理模式是一种设计模式,为对象提供替身,以控制对这个对象的访问;

说实在,看完这个脑子退化二十年,只能说-------抽象啊!!!

简单的说:代理模式就是客户想要实现新的功能,如果直接在业务代码中改动耗材耗力,所以我们就找到代理,让他帮我们实现这个功能,到时候只需要调用这个代理就能实现新的功能;

举例:

汽车制造商生产出来的车要卖出去,不可能直接卖到我们手里,肯定是先找到4s店或者专卖店,再卖给我们,4s店和专卖店就是我们说的代理。

1.1两种代理模式

代理模式:可分为静态代理和动态代理,动态代理又有JDK动态代理和Cglib动态代理,但本文以JDK动态代理为例说明;

静态代理和动态代理的区别:静态代理的编译期是确定的,但是动态代理是在运行期才能确定的;

2.两种代理举例

2.1静态代理

我们首先看一下没有使用代理功能时,我们如果要实现一个日志功能,那么我们就需要在实现类中的每个方法都添加一个日志 ,这就违背了我们设计的OCP原则--也就是对扩展开放,对修改闭合!

实现类(通过写接口,实现类实现接口中的方法)

2.2静态代理实现日志功能

我们先看一张静态代理实现日志功能的类图

一眼下去把我自己干懵逼了,不过,保持耐心,跟着思路,待会就明白咯!

 某天,有一个曾经的客户找上门了,说我们以前给他们做的保存客户的功能模块用起来不够爽,还想要再来一个日志功能,能够记录做了什么事情!!!

那么你会怎么做?该原本业务层的代码???这绝对是不可行的!!!

所以我们选择找一个代理类实现这个功能

代理类:在代理类中我们也需要重新实现业务中的方法

而日志功能我们也只需要向其他业务类一样创捷接口与实现类咯

那么此时此刻我们再回到前面的类图进行分析!!!

代码的随着客户的需求改变而改变,但是我们不可能每次都在原有代码上再进行大的改动;毕竟我们都看过那个形象的公告,一个人把其中的一颗不同颜色的小豆子拿掉后,就开始崩塌了;

所以此时此刻,我们就创建一个用户代理类(UserServiceProxy)把原本的功能方法实现,并且增加上新的功能--也就是日志功能;

将来我们就可以通过用户代理类实现原有的功能和新增的功能了;如果还需要其他的功能,那我们就再写一个实现类和接口再在用户代理类中调用就好;

 2.3动态代理

静态代理之所以称之为静态代理,还是因为其不够灵活---假如你的用户有很多功能,比如,保存用户,删除用户,增加用户,那么我们在这个代理类中的这些实现方法中都需要加上日志的功能,工作量大大提升。

所以这时候就有了动态代理,无论我们有多少功能,我们都只需要写一次日志功能的代码,那么所有的功能也都增加上了这个功能。

动态代理又分为JDK动态代理和cglib动态代理,我们以JDK动态代理为例进行了解!

话不多说,上图!

 好的,看完这张图,懵逼的我又懵逼上了……

JDK动态代理的第一步:写一个动态代理类去实现InvocationHandler接口,也就是下面的invoke方法,那么它是通过反射调用类对象,从而来实现动态代理!!!

 然后我们就需要创建一个Object 的createProxyObject方法了,我们根据下一步的目标对象来生成一个代理对象tartgetObject,然后使用代理对象去做事情,也就是invoke();

 前面说的根据目标对象就是这里的UserServiceImpl,然后代理对象调用目标方法(这里是通过反射得到的)

执行的顺序UserController-->UserServiceProxy-->UserServiceProxy-->UserServiceImpl

这里的执行顺序大家可以去写代码debug实现以下(打上断点,看看先跑哪个,更有益于理解动态代理)

 2.4总结

看完了整篇文章,我想说的是,光看不写是搞不会的,看上去只能是懵逼状态,真正去写的时候你也会发现,其实也不是这么难!

分享自己的观点,如果能够对你有帮助,那我也能开心,保持耐心,去学习,进步是一定会来的!!!

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是指在软件开发过程中,经过总结和归纳后形成的针对某类问题的解决方案。设计模式可以帮助开发人员更好地组织和管理代码,提高代码的可重用性和可维护性。常见的设计模式包括: 1. 创建型模式:用于处理对象创建的模式,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 2. 结构型模式:用于处理对象间关系的模式,包括适配器模式、装饰器模式、代理模式、组合模式、桥接模式和享元模式。 3. 行为型模式:用于处理对象间通信的模式,包括观察者模式、模板方法模式、命令模式、迭代器模式、责任链模式、访问者模式、策略模式和状态模式。 下面对常用的几种设计模式进行详细介绍: 1. 单例模式:确保一个类只有一个实例,并提供全局访问点。 2. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。 3. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 4. 建造者模式:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 5. 原型模式:通过复制现有的实例来创建新的实例。 6. 适配器模式:将一个类的接口转换成客户端所期望的另一种接口,使原本不能一起工作的类可以协同工作。 7. 装饰器模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类方式更为灵活。 8. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 9. 组合模式:将对象组合成树形结构以表示”部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 10. 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 11. 享元模式:运用共享技术有效地支持大量细粒度的对象。 12. 观察者模式:定义了对象之间的一对多依赖,当一个对象状态改变时,它所有依赖者都会收到通知并自动更新。 13. 模板方法模式:定义一个算法的骨架,将一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。 14. 命令模式:将请求封装成对象,从而可以用不同的请求对客户进行参数化,使得请求排队或记录请求日志,以及支持可撤销操作。 15. 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 16. 责任链模式:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 17. 访问者模式:表示一个作用于某个对象结构中的各元素的操作,它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作。 18. 策略模式:定义一系列算法,将每个算法都封装起来,并使它们之间可以互换。 19. 状态模式:允许一个对象在其内部状态改变时改变其行为,对象看起来似乎修改了其所属的类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值