如何增强对象的功能:
设计模式:一些通用的解决固定问题的方式
1.装饰模式
2.代理模式
概念:
1.真实对象:被代理的对象
2.代理对象
3.代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
实现方式:
1.静态代理:有一个类文件描述代理模式
2.动态代理:在内存中形成代理类
动态代理实现步骤:
1.代理对象和真实对象实现相同的接口
2.获取代理对象:代理对象 = Proxy.newProxyInstance();
3.使用代理对象调用方法
4.增强方法
package proxy;
/**
* @Date 2019/7/9 - 13:22
* 代理类
*/
public interface Agent {
public String sale(double money);
}
package proxy;
/**
* @Date 2019/7/9 - 13:25
* 真实类
*/
public class Retailer implements Agent {
@Override
public String sale(double money) {
return "卖出xxx赚了" + money + "元";
}
}
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Date 2019/7/9 - 13:28
*/
public class Test {
public static void main(String[] args) {
//1.创建真实对象
Retailer retailer = new Retailer();
//2.使用动态代理增强retailer对象
/**
* Proxy.newProxyInstance三个参数:
* 1.类加载器:真实对象.getClass().getClassLoader()
* 2.接口数组:真实对象.getClass().getInterfaces()
* 3.处理器:new InvocationHandler()
*/
Agent proxyInstance = (Agent) Proxy.newProxyInstance(retailer.getClass().getClassLoader(),
retailer.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理逻辑编写的方法:
* 代理对象调用的所有方法都会触发该方法的执行
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* 参数:
* 1.Object proxy:代理对象
* 2.Method method:代理对象调用的方法被封装成Method对象
* 3.Object[] args:代理对象调用方法时传递的实际参数
*/
//判断是否是sale方法
if (method.getName().equals("sale")) {
//1.增强参数
double commission = (double) args[0];
commission *= 0.2;
Object obj = method.invoke(retailer, commission);
return obj;
//2.增强返回值
//3.在方法题中增强
} else {
Object obj = method.invoke(retailer, args);
return obj;
}
}
});
//2.调用方法:使用代理对象调用方法,不再使用真实对象
System.out.println(proxyInstance.sale(5000));
}
}