1. 概念
1.代理模式是什么?
其实就是选一个中间人,可以理解为中介,如果要买房子,先和中介去商量,中介和房主去商量,这样。
2.为什么需要代理模式?
其实还是为了安全吧,代理模式中间可以添加校验信息等,增加安全性,避免直接对类的访问
2.静态代理
1.介绍
静态代理其实就是,替身,或者克隆人。
- 被代理类:
- 代理类: 将被代理类作为属性,调用时相同方法,中间调用被代理类的方法
- 接口类:定义方法,被代理类与代理类都需要实现接口
2.代码
1.接口类Person
/**
* @Description: 代理对象和被代理对象的公共接口
*/
public interface Person {/*** 都具备发送消息的功能** @param msg*/void sendMsg(String msg);
}
2.被代理类Student
/*** @Description: 被代理对象 具体的学生*/
public class Student implements Person {@Overridepublic void sendMsg(String msg) {System.out.println("I say " + msg);}
}
3. 代理类StudentProxy
/*** @Description: 代理对象*/
public class StudentProxy implements Person {/*** 代理类提前在代码中确定被代理对象是学生*/private Student student;public StudentProxy(Student stu) {this.student = stu;}@Overridepublic void sendMsg(String msg) {// 代理对象增加额外工作System.out.println("static proxy do something...");// 通过代理对象调用被代理对象的方法student.sendMsg(msg);}
}
4.总结
StudentProxy与Student都实现Person,而Proxy是实现方法同时加入自己逻辑。
3.动态代理
1.JAVA动态代理
动态代理还是反射实现
1.代理类实现InvocationHandler
因为他需要调用invoke方法
public class StudentProxyInvokeHandler implements InvocationHandler {private Student student;public StudentProxyInvokeHandler(Student student) {this.student = student;}@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {System.out.println("代理成功,直接逃课");return method.invoke(student,objects);// 代理类调用方法调用时被代理类的方法}
2.实现类
使用Proxy的newProxyInstance方法来创建一个接口,通过接口去调用最终结果,这个getProxyInstance返回的其实就是Person
public class ProxyFactory {public static Object getProxyInstance(Student student){StudentProxyInvokeHandler studentProxyInvokeHandler = new StudentProxyInvokeHandler(student);return Proxy.newProxyInstance(student.getClass().getClassLoader(), student.getClass().getInterfaces(),studentProxyInvokeHandler);}
}