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;
}