Spring5-装饰者模式及动态代理

一、设计模式

1.1 增强一个类功能,把已有的类进行一个拓展

继承(高内聚,低耦合)

​ 缺点:继承的越多,耦合性越高,改动一个,受影响的越多

​ 用继承来增强:增强的对象不能变,增强的功能是可以变的

​ ==原因:==子类可以无限派生,但子类的功能写死了,不能变,只要增加一个功能就要增加一个子类,会造成类很多,不好用

image-20200918093731784

​ 装饰者模式来增强:增强的对象可以变,增强的功能不能变

​ 下面来进行对比

二、装饰者模式

示例

一杯coffee,在原来咖啡的基础上进行包装,返回一个加糖加盐加奶的咖啡,但返回的永远是咖啡,功能不变

image-20200918094403851 image-20200918094424844

image-20200918094505918

功能主要靠父类实现

image-20200918094930854

bufferwriter装饰器数据流,就是在上面加了一个缓存区,真正的功能还是由out.write来实现

image-20200918095207456

二、静态代理(WTF?)

没有标准,网上写的很多版本,就跟把继承和装饰者拼一起差不多,真正的设计模式里根本没有静态代理

示例

把装饰者模式的范围写的更小了,传的就是someservice的一个实现类,只能增强一个实现类,功能太弱,其实就是继承,没什么乱用

image-20200918100350834

三、动态代理

dynamicproxy

一个类写的不是很好,怎么办

再实现一个类:不好,不灵活

动态代理来增强:

3.1 Proxy方法增强

JDK自带的动态代理,要增强的对象必须实现接口

image-20200918110546512

SomeServiceImpl()是增强目标对象

Proxy方法三个参数

image-20200918103530684

3.1.1类加载器

ClassLoader loader

3.1.2 接口类型

Class<?>[] interfaces

没有借口用类似cglid.jar包,没有借口也能增强

3.1.3 接口(执行扩展的增强功能,实现接口的方法,实现增强)

匿名内部类:实质就是一个接口的实现类

只能用一次,不能复用

image-20200918101929940

系统会给你定义一个类

image-20200918102055259

想复用定义在外面就可以

又有三个参数

image-20200918104233726

动态代理最灵活(增强的类可以变,功能也可以变),但实际应用要看实际情况,像buffer装饰者模式就没必要用动态代理,它的功能是固定的

image-20200918104402443

底层给你创建的增强的动态代理对象,就是接口的实现类对象

image-20200918104549266

mybatis的getMapper的底层就是动态代理

四、示例

前置增强和后置增强

image-20200918105828745

区分方法增强,加判断

image-20200918110006059

把do开头的方法都用大写表示,想怎么配自己去控制

image-20200918115719197

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值