readme
代理模式:
真实对象:被代理的对象
代理对象:就是代理对象
代理模式:代理对象代理真实对象,达到增强真实对象功能目的
实现方式:
动态代理:
1、代理对象和真实对象实现相同的接口
2、代理对象 = Proxy.newProxyInstance()
3、使用代理对象调用方法
4、增强方法
增强方式:
1、增强参数列表
2、增强返回值类型
3、增强方法体逻辑
demo-代理商+原厂卖手机
接口
package com.example.newyear.proxy;
public interface SalePhone {
public String sale(double maney);
public void show();
}
真实类
package com.example.newyear.proxy;
/**
* 真实类
*/
public class lenovo implements SalePhone{
@Override
public String sale(double maney) {
System.out.println("花了"+maney+"买了一台电脑");
return "lenove pc";
}
@Override
public void show() {
System.out.println("展示电脑....原价8000");
}
}
代理测试类
package com.example.newyear.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理测试类
*/
public class Proxytest {
public static void main(String[] args) {
//创建真实对象
lenovo lno = new lenovo();
//动态代理增强lno对象 底层:反射一个实现相同接口的类,这个新类的方法里面包含了对旧类方法的引用,使用这个新类实例化一个对象
// 这个方法会返回一个代理对象
// 固定写法 传入lno对象的类加载器和所有接口
/**
* 三个参数:
* 1、类加载器:真实对象.getClass().getClassLoader()
* 2、接口数组:真实对象.getClass().getInterfaces() 保证代理对象和真实对象实现了相同的接口
* 3、处理器:new InvocationHandler() 核心业务的处理
*
* 因为代理对象和真实对象都是实现SalePhone接口,所以可以直接强转,方便阅读
*/
SalePhone proxy_lno = (SalePhone) Proxy.newProxyInstance(lno.getClass().getClassLoader(), lno.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理逻辑里面写的方法:代理对象调用的所有方法都会触发该方法执行
* @param proxy :代理对象,就是上面的proxy_lno
* @param method : 代理对象调用哪个方法,就会把哪个方法通过反射封装成对象传入
* @param args :代理对象调用的方法时,传递的实际参数
* @return
* @throws Throwable
*/
@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]);
//代理对象只是增强真实对象的,因此这里面需要使用真实对象调用方法进行执行 而方法已经通过虚拟对象传入method中了
//方法被真实对象执行
// Object obj = method.invoke(lno, args);
//使用真实对象调用方法执行后,返回的结果,这里return是给到代理对象,所以下面的pc=obj
// return obj;
//上面那部分需要好好理解,可以把注释去掉,运行进行理解,但是记得注释下面这部分
//案例:比如供应商(代理对象),代理卖联想的电脑,卖出价格是进价的1.1
// 判断是否是sale方法,如果不是sale方法,就不会触发
if (method.getName().equals("sale")){
//增强参数
double maney = (double) args[0];
maney = maney*1.1;
//增强方法体
System.out.println("客户");
Object obj = method.invoke(lno, maney);
System.out.println("客户血赚");
//增强返回值
return "因为"+obj+"送了鼠标";
}else {
Object obj = method.invoke(lno, args);
return obj;
}
}
});
//使用代理对象调用真实类中的方法
String pc = proxy_lno.sale(8000);
System.out.println(pc);
// proxy_lno.show();
}
}
通过代理,可以对真实对象进行增强,输出了更多的内容