• 设计模式(二) 动态代理


    1.1、动态代理

          在程序运行时,运用反射机制在内存中动态创建代理对象,其实现的功能是与静态代理的功能是类似的,都是增强目标对象额外的功能操作,扩展目标对象。只不过是实现的方法不一致而已。

    1.2、动态代理实现的要求

          1代理对象,不需要实现与目标一样的接口;

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

          3)  动态代理, JDK代理或者接口代理;

          JDK中生成代理对象的APIProxy 

                  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实现

     
    
    
    
  • 相关阅读:
    php之工厂模式
    PHP 给GIF 缩略图实例代码
    WGS84 Mercator project转换的算法(C#)
    .net Enum用法
    Google Maps API编程资源大全
    结对作业
    使用Lightbox制作照片条
    使用css3中transition的页面切换
    使用css3中transition的页面切换(继续创新版)
    iframe中父窗口获取子窗口的元素
  • 原文地址:https://www.cnblogs.com/yuanchaoyong/p/6413571.html
Copyright © 2020-2023  润新知