代理模式
(Proxy Pattern)是设计模式的一种,在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于代理模式。
举个生活中的例子:在租房子的时候,房东可以租房,二房东也能够租房。两者执行的功能是一样的,就构成了代理模式;
动态代理
代理模式根据创建的时间分为静态代理和动态代理;其中代理类在程序运行时创建代理类的代理方式称为动态代理;以后动态代理更为常用,所以今天介绍一下动态代理。
还是以房东与二房东的关系为例子来解释;
实现步骤
1.代理对象与真实对象实现相同的接口‘
2.代理对象用newProxyInstance()方法创建
3.代理对象调用方法;
4.增强方法;
用代码来实现就是:
接口 rent:
房东 landlord类 实现rent接口,进行租房
二房东 middleman类 也实现rent接口,进行租房
import com.sun.deploy.security.SelectableSecurityManager;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
SaleMan saleMan=new SaleMan();
/**
* newProxyInstance的参数列表是固定格式,不用过分纠结
* 返回值是Object,但可以强制类型转换成接口
*/
Lenovo SecondAgent = (Lenovo) Proxy.newProxyInstance(SaleMan.class.getClassLoader(), SaleMan.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("sale")) {
//是sale方法
double price = (double) args[0] * 2.0;//增强方法,修改参数
String obj =(String) method.invoke(saleMan, price);
//method.invoke()调用真实对象方法
return obj+"。。。。。。。。。现在有点亏";
} else {
Object invoke = method.invoke(saleMan, args);
return invoke;
}
}
});
System.out.println(SecondAgent.sale(8000));
SecondAgent.show();
}
}