package com.item.designpattern;
/**
* 1.真实类
*/
public class Lenovo implements SaleComputer
{
@Override
public String sale(double money)
{
System.out.println("客户花了"+money+"买了一台电脑!");
return "联想电脑";
}
@Override
public void show()
{
System.out.println("展示电脑");
}
}
package com.item.designpattern;
public interface SaleComputer
{
public String sale(double money);
public void show();
}
package com.item.designpattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 1.代理测试类
*/
public class ProxyTest
{
public static void main(String[] args)
{
/**
* 1.创建真实对象
* 2.动态代理增强lenovo对象
* 2.1类加载器,真实对象.getClass().getClassLoader()
* 2.2接口数组 真实对象.getClass().getInterfaces()
* 2.3处理器 new InvocationHandler()
* 3.调用方法
*/
Lenovo lenovo = new Lenovo();
SaleComputer proxyLenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler()
{
/**
* 1.代理逻辑进行编写的方法
* 2.代理对象调用所有的方法都会触发该方法的执行
* 3.invoke(Object proxy, Method method, Object[] args)的三个参数
* 3.1 proxy:代理对象(其实指的是proxyLenovo)
* 3.2 method:代理对象调用的方法被封装为的对象
* 3.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]);*/
/**
* 1.增强参数
* 2.判断是否是sale方法
*/
if (method.getName().equals("sale"))
{
//1.增强参数
double money = (double) args[0];
money = money * 0.85;
System.out.println("专车接你...");
//使用真实对象调该方法
String obj = (String) method.invoke(lenovo, money);
System.out.println("免费送货...");
//增强返回值类型
return obj+"_1200多送一个鼠标垫";
}
else
{
Object obj = method.invoke(lenovo, args);
return obj;
}
}
});
String computer = proxyLenovo.sale(8000);
System.out.println(computer);
/* proxyLenovo.show();*/
}
}