1、代理模式:为其他对象提供一种代理,以控制对这个对象的访问。代理模式在客户端和目标对象之间起中介作用。
2、静态代理
RealSubject为被代理对象,SubjectProxy为代理对象,代理对象持有被代理对象的引用,可以在执行代理方法时添加自己的操作。
创建一个学生接口。
public interface Student {
/**
* 做语文作业
*/
void doChineseHomework();
/**
* 做数学作业
*/
void doMathematicHomework();
}
创建一个学生实例Tom【被代理对象】
public class Tom implements Student {
@Override
public void doChineseHomework() {
System.out.println("Tom做语文作业。。。");
}
@Override
public void doMathematicHomework() {
System.out.println("Tom做数学作业。。。");
}
}
然后再创建一个私教类。可以理解为学生的代理。【代理类】
public class PrivateTutor implements Student {
private Student student;
public PrivateTutor(Student student) {
this.student = student;
}
@Override
public void doChineseHomework() {
System.out.println("【私教】指导做作业");
student.doChineseHomework();
System.out.println("【私教】指导完成");
}
@Override
public void doMathematicHomework() {
System.out.println("【私教】指导做作业");
student.doMathematicHomework();
System.out.println("【私教】指导完成");
}
}
客户端调用
Tom tom = new Tom();
PrivateTutor tutor = new PrivateTutor(tom);
tutor.doChineseHomework();
tutor.doMathematicHomework();
3、JDK实现动态代理
创建JDK代理类
public class JdkPrivateTutor implements InvocationHandler {
/**
* 被代理对象
*/
private Student student;
/**
* 私有化构造方法,不允许外部调用
* @param student
*/
private JdkPrivateTutor(Student student) {
this.student = student;
}
/**
* 通过该方法获取代理类
* @param student
* @return
*/
public static Student getInstance(Student student) {
JdkPrivateTutor tutor = new JdkPrivateTutor(student);
return (Student)Proxy.newProxyInstance(
student.getClass().getClassLoader(),
student.getClass().getInterfaces(),
tutor
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("指导作业中");
method.invoke(student, args);
System.out.println("指导完成");
return null;
}
}
客户端调用
Tom tom = new Tom();
Student student = JdkPrivateTutor.getInstance(tom);
student.doChineseHomework();
student.doMathematicHomework();