实现静态代理的两种方式
聚合比继承更适合代理模式
案例描述:上节课程中,对Car类的move方法增加了时间处理的额外功能,现在想实现代理之间功能的叠加,也就是在move方法前后不仅做时间的处理,还做权限的管理和增加日志的管理。
通过继承实现上述功能:Car1的move方法里调用Car的move方法前后增加了时间处理的功能,现在要做代理类功能的叠加(先记录日志再记录汽车行驶的时间)。首先需要创建一个Car3,来继承Car1(Car1通过继承方式实现静态代理),或者继承Car,然后在move方法前后先实现日志,再实现汽车行驶时间的处理(这样会先输出日志再输出时间处理)。
如果先要记录汽车行驶的时间,再进行日志的处理,则需要创建一个Car4,先对时间处理,再对日志处理。
如果先要权限的判断、再进行日志的处理、然后再进行时间处理,则需要创建一个Car5。
如果先要权限的判断、再进行时间的处理、然后再进行日志的处理,则需要创建一个Car6.
结果得出如果使用继承的方式实现代理功能的叠加,代理类会无限的增多,也就是用一个代理则需要创建一个代理,所以继承的方式实现代理功能的叠加不是推荐的。
通过聚合实现上述功能:由于代理类和被代理类都实现了相同的接口 ,所以代理类的构造方法中也可以传入接口的对象(针对Car2代理类),代理类中声明的也是接口的对象。再创建一个CarLogProxy代理类(它实现了接口)用来做日志的功能。
如下是先记录日志再记录时间
如下是先记录时间再记录日志
结果通过聚合方式实现代理会比继承方式灵活很多,使用聚合方式代理之间是可以相互传递的,所以推荐使用聚合方式实现代理模式(这里通过聚合实现代理实现了不同功能的顺序)。
静态代理:代理和被代理对象在代理之前是确定的.他们都实现相同的接口或者继承相同的抽象类.
静态代理的两种实现方式:
1.继承方式
不建议使用,如果使用继承则会造成代理类无限叠加下去
2.聚合方式
代理之间可以相互传递,互相组合,提高代理的复用性
@设计模式——代理模式——静态代理的实现 1、聚合代理优于继承代理。因为实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。 2、但静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理
4、聚合比继承更适合代理模式
如果使用继承的方式实现代理功能的叠加,代理类则会无限的膨胀。
使用聚合的方式实现代理功能的叠加和组合比较方便实用。
@设计模式---代理模式之 聚合方式做代理模式
1.聚合代理优于继承代理。
在实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。
2.但静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理