代理模式
* 概念:
1. 真实对象:被代理的对象
2. 代理对象:
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
1. 静态代理:有一个类文件描述代理模式
2. 动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
动态代理代码演示
1.共同的接口
public interface SaleComputer {
public String sale(double money);
public void show();
}
2.真实类
/**
* 真实类
*/
public class Lenovo implements SaleComputer {
@Override
public String sale(double money) {
System.out.println("花了"+money+"钱买了一台联想电脑");
return "联想电脑";
}
@Override
public void show() {
System.out.println("展示电脑...");
}
}
3.代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//1.创建真实对象
Lenovo lenovo = new Lenovo();
//动态代理增强lenovo方法
/*该方法的三个参数:
* 1.类加载器: 真实对象.getClass().getClassLoader()
* 2.接口数组: 真实对象.getClass().getInterfaces()
* 3.处理器: new InvocationHandler() {} -->编写代理的逻辑
*/
//Proxy.newProxyInstance()方法返回的是一个代理对象,可以将这个代理对象转成接口对象
SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
//代理逻辑编写的方法,代理对象调用的所有方法都会触发该方法的执行
/*该方法的三个参数:
* 1.proxy : 代理对象
* 2.method : 该方法会将代理对象调用的方法封装成为一个对象,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]);*/
//判断是否是sale方法--是sale方法才增强
if (method.getName().equals("sale")) {
//增强参数
double money = (double) args[0];
money = money * 0.85;
System.out.println("专车接驾...");//增强方法体的逻辑
//使用真实对象调用该方法--代理对象本身是无法调用真实对象的方法的,真实对象调用方法然后将结果交给代理对象
Object obj = method.invoke(lenovo, money);
System.out.println("免费送货到家...");//增强方法体的逻辑
//增强返回值
return obj + "_鼠标垫";
} else {//不是sale方法就原样执行(该咋执行咋执行)
Object obj = method.invoke(lenovo, args);
return obj;
}
}
});
//2.使用代理对象调用方法
String computer = proxy_lenovo.sale(8000);
System.out.println(computer);
//lenovo.show();
//proxy_lenovo.show();
}
}