代理模式是Java常见的设计模式之一。所谓代理模式,是指客户不直接调用实际对象,而是间接调用实际对象。
为什么要用这种间接的形式来调用对象?一般来说,客户不想直接访问实际对象,或者很难访问实际对象,所以间接访问是通过代理对象完成的。
这种情况在现实生活中很常见,比如请律师代理打官司。
1.实现代理模式1.1静态代理接口或父类需要定义,目标对象与代理对象实现相同的接口或继承相同的父类。
优点:目标对象的功能可以在不修改目标对象功能的情况下扩展。
缺点:代理对象需要实现与目标对象相同的接口,代理类别很多。一旦添加了界面,目标对象和代理对象都需要维护。
代理的每个接口对应一个委托对象。如果委托对象很多,静态代理非常臃肿,难以胜任。
1.2 动态代理代理对象不实现接口,目标对象实现接口,可以使用动态代理,否则不能使用
动态代理,又称JDK代理,接口代理。
使用JDKAPI在内存中动态构建代理对象,不需要实现接口,但需要指定接口类型。
代理类所在包,java.lang.reflect.Proxy,使用newproxyinstance方法创建。
目标对象使用上述User创建动态代理DynamicproxyFacotry
步骤如下:
1.编写一个委托类接口,即静态代理(Subject接口)
2.实现静态代理(RealSubject)的真正委托类
3.创建动态代理类,实现InvocationHandler接口,并重写invoke方法
4.在测试类中生成动态代理对象。
1.3 cglib代理静态代理和动态代理模式都要求目标对象实现一个接口,但有时目标对象只是一个单独的对象,没有任何接口。此时,可以使用目标对象子类实现代理。这种方法被称为cglib代理。也被称为子类代理,它在内存中构建子类对象,以实现目标对象的扩展。