一、设计模式
1.1 增强一个类功能,把已有的类进行一个拓展
继承(高内聚,低耦合)
缺点:继承的越多,耦合性越高,改动一个,受影响的越多
用继承来增强:增强的对象不能变,增强的功能是可以变的
==原因:==子类可以无限派生,但子类的功能写死了,不能变,只要增加一个功能就要增加一个子类,会造成类很多,不好用
装饰者模式来增强:增强的对象可以变,增强的功能不能变
下面来进行对比
二、装饰者模式
示例
一杯coffee,在原来咖啡的基础上进行包装,返回一个加糖加盐加奶的咖啡,但返回的永远是咖啡,功能不变
![image-20200918094403851](https://db-zhanzhaoxu.oss-cn-chengdu.aliyuncs.com/Picture/20200918094403.png)
![image-20200918094424844](https://db-zhanzhaoxu.oss-cn-chengdu.aliyuncs.com/Picture/20200918094424.png)
功能主要靠父类实现
![image-20200918094930854](https://db-zhanzhaoxu.oss-cn-chengdu.aliyuncs.com/Picture/20200918094930.png)
bufferwriter装饰器数据流,就是在上面加了一个缓存区,真正的功能还是由out.write来实现
二、静态代理(WTF?)
没有标准,网上写的很多版本,就跟把继承和装饰者拼一起差不多,真正的设计模式里根本没有静态代理
示例
把装饰者模式的范围写的更小了,传的就是someservice的一个实现类,只能增强一个实现类,功能太弱,其实就是继承,没什么乱用
三、动态代理
dynamicproxy
一个类写的不是很好,怎么办
再实现一个类:不好,不灵活
动态代理来增强:
3.1 Proxy方法增强
JDK自带的动态代理,要增强的对象必须实现接口
SomeServiceImpl()是增强目标对象
Proxy方法三个参数
3.1.1类加载器
ClassLoader loader
3.1.2 接口类型
Class<?>[] interfaces
没有借口用类似cglid.jar包,没有借口也能增强
3.1.3 接口(执行扩展的增强功能,实现接口的方法,实现增强)
匿名内部类:实质就是一个接口的实现类
只能用一次,不能复用
系统会给你定义一个类
![image-20200918102055259](https://db-zhanzhaoxu.oss-cn-chengdu.aliyuncs.com/Picture/20200918102055.png)
想复用定义在外面就可以
又有三个参数
动态代理最灵活(增强的类可以变,功能也可以变),但实际应用要看实际情况,像buffer装饰者模式就没必要用动态代理,它的功能是固定的
底层给你创建的增强的动态代理对象,就是接口的实现类对象
mybatis的getMapper的底层就是动态代理
四、示例
前置增强和后置增强
区分方法增强,加判断
把do开头的方法都用大写表示,想怎么配自己去控制