• 代理模式及java简易实现


    Java代理模式

    基本概念

    1. 真实对象:被代理的对象
    2. 代理对象:
    3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
    /*
    例如联想只负责生产电脑但是不负责销售也不提供保修服务,京东代理销售联想送货上门,并提供保修服务就是对电脑商品的强化.
    在这里真实对象就是联想生产的电脑,而代理对象就是京东
    */
    

    实现方式

    1. 静态代理:有一个类文件描述代理模式
    2. 动态代理:在内存中形成代理类
    	* 实现步骤:
    		1. 代理对象和真实对象实现相同的接口
    		2. 代理对象 = Proxy.newProxyInstance();
    		3. 使用代理对象调用方法。
    		4. 增强方法
    

    实例

    //demo,建议复制进ide阅读
    public class test {
        public static void main(String[] args) {
            //public interface Save { public int setMoney(int x);}
            class Wallet implements Save {
                private int money;
                @Override
                public int setMoney(int x) {
                    money += x;
                    System.out.println("又存了" + money);
                    return money;
                }
            }
            Wallet wallet = new Wallet();
            /*
            三个参数(固定写法)
                1.类加载器 真实对象.getClass().getClassLoader();
                2.接口数组 真实对象.getClass().getInterfaces();
                3.处理器   new InvocationHandler();
             */
            Save save = (Save) Proxy.newProxyInstance(wallet.getClass().getClassLoader(), wallet.getClass().getInterfaces(), new InvocationHandler() {
                /*
                代理逻辑编写的方法,代理对象调用所有方法都会触发该方执行
                    参数
                        1.proxy:代理对象
                        2.method:代理对象调用的方法被封装为的对象
                        3.args:代理对象调用方法时传递的实际参数
                */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("代理被调用");
                    System.out.println(method.getName());
                    System.out.println(args[0]);
                    //使用真实对象调用该方法
                    Object obj = method.invoke(wallet, args);
                    return obj;
                }
            });
            int money = save.setMoney(8000);
            System.out.println("现在我一共有" + money);
        }
    }
    -------------------------------------------------------------------------------
    //打印结果
    代理被调用
    setMoney
    8000
    又存了8000
    现在我一共有8000
    

    增强方式

    1. 增强参数列表
    2. 增强返回值类型
    3. 增强方法体执行逻辑	
    

    实例

    //demo
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
    {
        System.out.println("你是否是XXX高校学生?Y=1/N=0");
        Scanner sc=new Scanner(System.in);
        int x=sc.nextInt();
        if(x==1)
            System.out.println("送你10000块");//增强方法体执行逻辑
        int money = (int) args[0];
        if (method.getName().equals("setMoney"))
            money -= 20;//增强参数
        int mon = (int) method.invoke(wallet, money);//调用方法
        mon-=20;        //增强返回值类型
        return mon;
    }
    
  • 相关阅读:
    音频、摄像机操作
    调用系统相机及摄像机
    图片的放大缩小
    haxm intelx86加速模拟器的安装
    mac eclipse 下安装subclipse
    文件多线程下载实现
    windows与linux之间传输文件
    ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性
    使用C语言在windows下一口气打开一批网页
    Net-SNMP是线程安全的吗
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/12466650.html
Copyright © 2020-2023  润新知