代理模式及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;
}
原文地址:https://www.cnblogs.com/INnoVationv2/p/12466650.html