设计模式之代理模式


代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

代理模式的作用:AOP实现,拦截器,中介,黄牛,解耦,专人做专事。

代理模式中有两种角色:代理角色,被代理角色(目标对象),由被代理角色来做最终决定,代理角色通常来说持有被代理角色的引用。


代理:静态代理,动态代理

设计模式之代理模式




静态代理实现代码:

情景:儿子想找对象和工作,拖中介和父亲帮忙,当然我这里中介类就没写了,直接拖父亲帮自己找工作和对象。

这里的儿子就是被代理的角色,父亲就是代理角色。Person 就是动态接口,让儿子和父亲都实现这个接口,当然要中介帮

忙找工作 ,让中介实现这个接口就行。


接口类:

设计模式之代理模式

被代理类:

设计模式之代理模式


代理类:

设计模式之代理模式


静态代理总结:
1.可以做到在不修改被代理角色(目标对象)的功能前提下,对被代理角色(目标对象)功能扩展.
2.缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.


动态代理:

代理对象,不需要实现接口
代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)

动态代理也叫做:JDK代理,接口代理。

实例代码:

代理工厂类:


设计模式之代理模式


测试类:

设计模式之代理模式


小结:目标对象一定要实现接口,否则不能动态代理。

若目标对象只是一个单独的对象,没有实现接口怎么代理呢?这时候我们需要了解一种使用目标对象子类来实现代理

的方法:Cglib代理。

Cglib是一个强大的高性能的代码生成包,他可以在运行期扩展java类与实现java接口,它广泛的被许多aop的框架使用,

例如:为Springaop提供方法的interception(拦截):

Cglib的实现(需要引入spring-core):

目标对象类:

设计模式之代理模式


Cglib代理工厂:

设计模式之代理模式

测试类:

设计模式之代理模式