1.什么是代理模式
代理模式在我的理解来看为了在不改变源代码的情况下对功能进行增强或者在方法执行前后进行一些我们需要的处理
由代理对象调用执行我们被代理对象的一些方法,在代理对象里面进行相应的添加 代理模式分成静态代理和动态代理
静态代理
静态代理比较好理解,代理对象和被代理对象都实现一个接口,接口里是抽出来的执行方法 然后我们在代理类里生成构造器引入被代理类,在方法里完成功能增强 贴出代码如
//被代理类
public class Person implements proxy{
public void method(){
System.out.println("我要学java");
}
}
//接口
public interface proxy {
void method();
}
//代理类
public class staticProxy implements proxy{
@Override
public void method() {
System.out.println("学java之间先考研!!");
person.method();
}
Person person;
public staticProxy(Person person) {
this.person=person;
}
}
public class main {
public static void main(String[] args) {
Person person=new Person();
staticProxy proxy=new staticProxy(person);
proxy.method();
}
}
代理类和被代理类编译期间就确定下来了
代理类和被代理类都继承一个公共的接口,公共的接口抽象出共用的方法
缺点:目标类增加,代理类也要增加,接口中功能增加了,会影响众多的实现类
动态代理
动态代理中,被代理类及时众多,代理类数量可以很少,修改了接口中的方法时不会影响代理类
可以使用jdk反射机制创建代理对象,动态指定被代理类
jdk的动态代理实现:
反射包:java.lang.reflect 里面三个类:invocationHandler,Method,Proxy
InvocationHandler接口就一个invoke方法,表达代理对象要执行的功能代码
实现动态代理的步骤:
1.创建接口,定义目标类要完成的功能 2.创建目标类实现接口 3.创建invocationHandler接口的实现类,在invoke方法里面完成代理类的功能,调用目标方法,增强功能 4.使用proxy类的静态方法,动态创建代理对象
//接口
public interface usbSell {
float sell(int amount);
}
//被代理对象
public class UsbKingFactory implements usbSell{
@Override
public float sell(int mount) {
System.out.println("目标类执行sellUsb");
return 85;
}
}
//实现invocationHandler接口,完成代理类需要的功能
public class MyHandler implements InvocationHandler {
private Object target=null;
//动态代理目标对象是活动的,不是固定的
public MyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res=null;
res= method.invoke(target,args);//执行目标方法
if(res!=null){
Float price=(Float) res;
price=price+25;
res=price;
}
System.out.println("给你优惠券");
return res;
}
}
public class Mainshop {
public static void main(String[] args) {
//1.创建目标对象
usbSell factory =new UsbKingFactory();
//2.创建invocationHandler对象
InvocationHandler handler=new MyHandler(factory);
//3.创建代理对象
usbSell proxy= (usbSell)Proxy.newProxyInstance(factory.getClass().getClassLoader(),factory.getClass().getInterfaces(),handler);
//4.执行方法
float price=proxy.sell(1);
}
}
动态代理稍微比较难理解一点,它运用到了java的反射机制,我们不是预先创建的代理对象,是动态生成的根据我们传进去的被代理对象不同为我们生成代理对象。是比较通用的