代理
- 静态代理(就是代理设计模式)
- 动态代理
- 基于接口的动态代理
- 基于子类的动态代理
静态代理
原始类
package com.wangzhy.interview.design.proxy;
public class Student implements Person {
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
@Override
public void wakeup() {
System.out.println("学生" + name + "早晨醒来啦");
}
@Override
public void sleep() {
System.out.println("学生" + name + "晚上睡觉啦");
}
}
代理类:在代理类中持有原始类的引用,然后在代理类中调用原始类的方法。
package com.wangzhy.interview.design.proxy;
public class PersonProxy implements Person {
private Person person;
public PersonProxy(Person person) {
this.person = person;
}
@Override
public void wakeup() {
System.out.println("早安~");
person.wakeup();
}
@Override
public void sleep() {
System.out.println("晚安~");
person.sleep();
}
}
使用代理类
Person student = new Student("张三");
PersonProxy studentProxy = new PersonProxy(student);
studentProxy.wakeup();
studentProxy.sleep();
静态代理的缺点:
- 有大量的冗余的代理类
- 代码维护成本高
- 需要声明的创建代理类。
动态代理
相对于静态代理,动态代理不需要声明式的创建代理类,在是运行过程中生成虚拟代理类。
JDK 动态代理
package com.wangzhy.interview.design.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxy implements InvocationHandler {
private Object bean;
public JdkProxy(Object bean) {
this.bean = bean;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
if (methodName.equals("wakeup")) {
System.out.println("早安~~~");
} else if (methodName.equals("sleep")) {
System.out.println("晚安~~~");
}
return method.invoke(bean, args);
}
public static void main(String[] args) {
JdkProxy proxy = new JdkProxy(new Student("张三"));
Person student = (Person) Proxy.newProxyInstance(proxy.getClass().getClassLoader(),
new Class[]{Person.class}, proxy);
student.wakeup();
student.sleep();
}
}