• java 代理模式(静态代理+动态代理)


    静态代理:

    ISubject:

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午1:49:29
     */
    public interface ISubject {
        public void request();
    }

    RealSubject(真实角色):

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午1:51:37
     */
    public class RealSubject implements ISubject{
    
        @Override
        public void request() {
            System.out.println("realSubject requesting");
        }
    }

    ProxySubject(代理类):

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午1:52:22
     */
    public class ProxySubject implements ISubject{
        private RealSubject realSubject;
        public ProxySubject() {
            realSubject = new RealSubject();
        }
    
        @Override
        public void request() {
            System.out.println("do something before");
            realSubject.request();
            System.out.println("do something after");
        }
    }

    Test(客户端测试):

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午1:54:47
     */
    public class Test {
        public static void main(String[] args) {
            ISubject proxySubject = new ProxySubject();
            proxySubject.request();
        }
    }

    ------------------------------------------------------------------------------------------------------------------------------

    动态代理:

    ISubject:

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午2:51:31
     */
    public interface ISubject {
        public void request();
    }

    RealSubject:

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午2:52:00
     */
    public class RealSubject implements ISubject{
    
        @Override
        public void request() {
            System.out.println("realSubject requesting");
        }
    }

    SubjectInvocationHandler(调用处理类):

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午2:54:38
     * 调用处理类
     */
    public class SubjectInvocationHandler implements InvocationHandler{
        private Object obj;
        
        public SubjectInvocationHandler(Object obj) {
            this.obj = obj;
        }
        
        /**
         * 生成代理类工厂
         * @author com.tiantian
         * @param realObj
         * @return 返回生成的代理类
         */
        public static Object getProxyInstanceFactory(Object realObj){
            Class<?> classType = realObj.getClass();
            return Proxy.newProxyInstance(classType.getClassLoader(), 
                    classType.getInterfaces(), new SubjectInvocationHandler(realObj));
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("before");
            
            method.invoke(obj, args);
            
            System.out.println("after");
            
            return null;
        }
    }

    Test:

    /**
     * @author com.tiantian
     * @version 创建时间:2012-11-20 下午2:56:25
     */
    public class Test {
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
    //        InvocationHandler handler = new SubjectInvocationHandler(realSubject);
    //        ISubject subject = (ISubject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
    //                realSubject.getClass().getInterfaces(), handler);
            ISubject subject = (ISubject)SubjectInvocationHandler.getProxyInstanceFactory(realSubject);
            subject.request();
            
        }
    }
  • 相关阅读:
    BIO与NIO、AIO的区别
    Java虚拟机
    PV模型
    HashMap、HashSet源代码分析其 Hash 存储机制
    单节点到分布式集群
    Oracle表分区
    ZooKeeper原理
    oracle中的 exists 和 in 的效率问题
    OQL对象查询语言
    keepalived openssl 报错
  • 原文地址:https://www.cnblogs.com/tiantianbyconan/p/2779095.html
Copyright © 2020-2023  润新知