zoukankan      html  css  js  c++  java
  • 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();
            
        }
    }
  • 相关阅读:
    VMware 虚拟机扩容磁盘
    记录一次Jenkins多分支构建问题
    ceph 集群快速部署
    阿里云EMAS发布套餐订阅云服务
    我研究过的OA产品这是简单的总结
    Hello,OA!Hello,工作流!寻找OA和工作流的旅途记录
    疑难杂症1-去掉网站里的特殊编码&#65279
    IIS 平台NET无后缀名伪静态实现办法
    让人无语的面试题!!排序!你试试?
    优秀的大企业报告辅助撰写系统介绍
  • 原文地址:https://www.cnblogs.com/tiantianbyconan/p/2779095.html
Copyright © 2011-2022 走看看