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