• 动态代理


    dunamic proxy
     
    动态代理模式相比静态代理,不需要自己写代理类
    jdk可以实现动态代理
    操作如下:
     
    公共接口:
    /**
     * ClassName: House<br/>
     * Description: 房子<br/>
     * date: 2018/12/26 11:08 AM<br/>
     *
     * @author chengluchao
     * @since JDK 1.8
     */
    
    public interface House {
        /**
         * 地址
         */
        void address();
    
        /**
         * 房租
         */
        void rent();
    
        /***
         * 租期
         */
        void leaseTerm();
        /**
         * 房东
         */
        void landlord();
    }

    真实角色:

    /**
     * ClassName: RealHouse<br/>
     * Description: 房东<br/>
     * date: 2018/12/26 11:14 AM<br/>
     *
     * @author chengluchao
     * @since JDK 1.8
     */
    
    public class RealHouse implements House {
        @Override
        public void address() {
            System.out.println("北京市-东城区-长安街-1号院-1号楼-1单元-101");
        }
    
        @Override
        public void rent() {
            System.out.println("3000/月");
        }
    
        @Override
        public void leaseTerm() {
            System.out.println("2年");
        }
    
        @Override
        public void landlord() {
            System.out.println("王大户");
        }
    }

    实现接口:

    /**
     * ClassName: HouseHandler<br/>
     * Description: <br/>
     * date: 2018/12/27 10:25 AM<br/>
     *
     * @author chengluchao
     * @since JDK 1.8
     */
    
    public class HouseHandler<T> implements InvocationHandler {
    
        private T t;
    
        public HouseHandler(T t) {
            this.t = t;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("真实操作前的操作");
            if (method.getName().equals("rent"))
                System.out.println("9000");
            else
                method.invoke(t, args);
            return null;
        }
    }

    测试类:

    /**
     * ClassName: HouseTest<br/>
     * Description:测试类 <br/>
     * date: 2018/12/26 11:21 AM<br/>
     *
     * @author chengluchao
     * @since JDK 1.8
     */
    
    public class HouseTest {
        public static void main(String[] args) {
            House real = new RealHouse();
            HouseHandler handler = new HouseHandler(real);
            House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, handler);
    
            proxy.address();
            proxy.landlord();
            proxy.leaseTerm();
            proxy.rent();
    
        }
    
    }

    真实操作前的操作
    北京市-东城区-长安街-1号院-1号楼-1单元-101
    真实操作前的操作
    王大户
    真实操作前的操作
    2年
    真实操作前的操作
    9000

    也可以使用lambad表达式,不需要写接口的实现类,直接在测试方法中调用:

     static void lamdTest() {
    
            House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, (object, method, args) -> {
                System.out.println("lamdTest-真实操作前的操作");
                if (method.getName().equals("rent"))
                    System.out.println("9000");
                else
                    method.invoke(new RealHouse(), args);
                return null;
            });
    
            proxy.address();
            proxy.landlord();
            proxy.leaseTerm();
            proxy.rent();
    
        }

    lamdTest-真实操作前的操作
    北京市-东城区-长安街-1号院-1号楼-1单元-101
    lamdTest-真实操作前的操作
    王大户
    lamdTest-真实操作前的操作
    2年
    lamdTest-真实操作前的操作
    9000

  • 相关阅读:
    hdu--1018--Big Number(斯特林公式)
    NYOJ--56--阶乘因式分解(一)
    hdu--1711--kmp应用在整形数组--Number Sequence
    HDU--1358--KMP算法失配函数getfail()的理解--Period
    C++STL(vector,map,set,list,bitset,deque)成员函数整理
    NYOJ--95--multiset--众数问题
    NYOJ--86--set.find()--找球号(一)
    NYOJ--19--next_permutation()--擅长排列的小明
    NYOJ--714--Card Trick
    NYOJ--2--括号配对问题
  • 原文地址:https://www.cnblogs.com/chenglc/p/10183657.html
Copyright © 2020-2023  润新知