设计模式(二) 动态代理
1.1、动态代理
在程序运行时,运用反射机制在内存中动态创建代理对象,其实现的功能是与静态代理的功能是类似的,都是增强目标对象额外的功能操作,扩展目标对象。只不过是实现的方法不一致而已。
1.2、动态代理实现的要求
1)代理对象,不需要实现与目标一样的接口;
2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型);
3) 动态代理, JDK代理或者接口代理;
JDK中生成代理对象的API:Proxy
static Object newProxyInstance(
ClassLoader loader, 指定当前目标对象使用类加载器(一般使用默认)
Class<?>[] interfaces, 目标对象实现的接口的类型
InvocationHandler h 事件处理器(在此添加对目标对象实现功能的扩展)
)
代码实现如下:
新建一个接口:IUserDao
public interface IUserDao { //接口对象 public void save();//保存用户 }
目标对象:UserDao
public class UserDao implements IUserDao { //目标对象 @Override public void save() { System.out.println("保存用户"); } }
工厂代理对象:ProxyFactory 可以实现对所有类的代理。
public class ProxyFactory { private Objects target; public ProxyFactory(Objects target) { this.target = target; } // 给目标对象返回代理对象 public Object getProxyInstance(){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("日志打印---开始---"); Object roxyObject = method.invoke(target,args); System.out.println("日志打印---结束---"); return roxyObject; } }); } }
结果:
动态代理总结:
代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
思考:
有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?点击此处查看cglib实现
人要耐得住寂寞,才能守得住繁华。人生最痛苦的就是拿不起放不下,不属于自己的快乐,及时放手也许是一种解脱,生活中没有谁对谁错,只有适不适合。当发现很多已经改变,更要面对的是事实。