`
new_Line
  • 浏览: 9767 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java 代理模式

 
阅读更多

------- android培训java培训、期待与您交流! ----------

基本概念:
    在Java程序中,代理就是在不修改源码的情况下,使得原本不具有某种行为的类对象具有该行为能力
特点:
    代理过程必须有两个实体参与,并且代理者要按照被代理者的意愿进行代理业务。
作用:
    为其他对象提供一种代理以控制对这个对象的访问。在某种情况下,一个客户不想或者不能直接引用另
    一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
代理模式涉及到角色:
    |--抽象角色:
        声明真实对象和代理对象的公共接口
    |--代理角色
        代理角色内部含有对真实对象的引用,从而可以操作真实对象
    |--真实角色
        代理角色所代表的真实对象,使我们最终要引用的对象

静态代理:
    演示说明:
        package com.itheima.proxy;
        /*
         * 面向接口编程
         * */
        public interface MyInter {
            public abstract void info();
        }
        package com.itheima.proxy;
        /*
         * 被代理类
         * */
        public class IsArgent implements MyInter {
            public void info()
            {
                System.out.println("制造商。。。");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        package com.itheima.proxy;
        /*
         * 这是一个代理类
         * */
        public class ProxyDemo {
            private MyInter mi;
            public ProxyDemo(MyInter mi)
            {
                this.mi = mi;
            }
            public long RunTime()
            {
                long start = System.currentTimeMillis();
                //执行需要被代理的方法
                mi.info();
                long end = System.currentTimeMillis();
                return end - start;
            }
        }
        package com.itheima.proxy;
        /*
         * 测试类
         * */
        public class Test {
            public static void main(String[] args) {
                ProxyDemo pd = new ProxyDemo(new IsArgent());
                long runTime = pd.RunTime();
                System.out.println(runTime);
            }
        }   
动态代理:
    所谓动态代理类,就是通过newProxyInstance()方法,在运行时自动生成的,在生成它时,
    必须为它提供一组要实现的接口,然后该类就宣称它实现了哪些接口。
    Java动态代理类位于java.lang.reflect包下,一般主要涉及到两个类。
    |--InvocationHandler:该接口仅定义了一个方法:
        |--Object invoke(Object proxy, Method method, Object[] args)
                    在代理实例上处理方法调用并返回结果。
            proxy:指代理类
            method:被代理的方法
            args:该方法的参数
    |--Proxy:该类即为动态代理类
        |--protected  Proxy(InvocationHandler h)
            使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。
        |--static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
            返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
        |--static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)
            返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
        |--
        演示说明:
            package com.itheima.dynamic.proxy;
            public interface Subject {
                public void request();
            }

            package com.itheima.dynamic.proxy;
            public class RealSubject implements Subject {
                @Override
                public void request()
                {
                    System.out.println("需要被代理的任务。。。");
                }
            }

            package com.itheima.dynamic.proxy;
            import java.lang.reflect.InvocationHandler;
            import java.lang.reflect.Method;
            public class DynamicSubject implements InvocationHandler {
                private Subject sub;
                public DynamicSubject(Subject sub)
                {
                    this.sub = sub;
                }
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable
                {
                    System.out.println("被代理执行之前:" + method);
                    method.invoke(sub, args);
                    System.out.println("被代理执行之后:" + method);
                    return null;
                }
            }

            package com.itheima.dynamic.proxy;
            import java.lang.reflect.InvocationHandler;
            import java.lang.reflect.Proxy;
            public class Test {
                public static void main(String[] args) {
                    //创建被代理类的对象
                    Subject sub = new RealSubject();
                    //创建代理类对象,并将被代理类传递进去
                    InvocationHandler handler = new DynamicSubject(sub);
                    //获取代理类的Class对象
                    Class c = handler.getClass();
                    //通过Proxy.newProxyInstance()方法,自动生成一个动态代理类实例
                    sub = (Subject)Proxy.newProxyInstance(c.getClassLoader(), sub.getClass().getInterfaces(), handler);
                    //调用方法
                    sub.request();
                    System.out.println("------------------------------------------------");
                    System.out.println("自动生成动态代理类的名字:" + sub.getClass().getName());
                    Class[] interfaces = sub.getClass().getInterfaces();
                    for(Class item : interfaces)
                        System.out.println("自动生成动态代理类所实现的接口" + item);
                   
                }
            }
            运行结果:
                被代理执行之前:public abstract void com.itheima.dynamic.proxy.Subject.request()
                需要被代理的任务。。。
                被代理执行之后:public abstract void com.itheima.dynamic.proxy.Subject.request()
                ------------------------------------------------
                自动生成动态代理类的名字:$Proxy0
                自动生成动态代理类所实现的接口interface com.itheima.dynamic.proxy.Subject

------- android培训java培训、期待与您交流! ----------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics