代理模式是什么
在公司上班,每月都要缴纳社保,你从来没有自己去社保中心缴纳过,都是由公司人力部门代你缴纳,人力小姐姐就是你的代理人,帮你做了这件事情。
火车票由铁路局印售,全国各地都有火车票代售点,你去最近的代售点就能买到你想要的车票,不用跑去铁路局,代售点就是铁路局的车票代理人,负责代理售卖火车票。
我具备做一件事情的能力,但是我不想和太多人直接打交道,就可以找个代理挡在我的前面,代替我和其他人交流,我只和代理交流,事情最终还是我来做,这就是代理模式。
代理模式应用到面向对象编程领域中,又可分为两个模式:静态代理、动态代理。最主要的区别:
- 静态代理:系统启动时,代理类就存在,是开发者自己编码出来的
- 动态代理:系统启动时,代理类不存在,是系统运行时动态生成的
代理模式的实现
静态代理
代理类要自己写,代码写着比较繁琐,但是运行时效率相对较高:
public interface Subject {
void request();
}
// 被代理类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("do something");
}
}
// 代理类
public class RealSubjectProxy implements Subject {
private final RealSubject subject;
public RealSubjectProxy(RealSubject subject) {
this.subject = subject;
}
@Override
public void request() {
System.out.println("proxy do something before");
subject.request();
System.out.println("proxy do something after");
}
}
使用的时候,要先创建出静态代理类对象,然后再做代理的事情:
public static void main(String[] args) {
Subject subject = new RealSubject();
Subject proxy = new RealSubjectProxy(subject);
proxy.request();
}
动态代理
这里使用JDK
动态代理举例,代码写着比较方便,但是运行时效率相对较低:
public interface Subject {
void request();
}
// 被代理类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("do something");
}
}
// 注意:这个类描述的是代理逻辑,不是代理类本身
public class ProxyLogic implements InvocationHandler {
private final Object subject;
public ProxyLogic(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy do something before");
Object invoke = method.invoke(subject, args);
System.out.println("proxy do something after");
return invoke;
}
}
使用的时候,要先调用JDK
的方法生成动态代理类对象,再去做代理的事情:
public static void main(String[] args) {
RealSubject subject = new RealSubject();
Subject proxy = (Subject) Proxy.newProxyInstance(
RealSubject.class.getClassLoader(),
new Class[]{Subject.class},
new ProxyLogic(subject)
);
System.out.println("系统生成的代理类: proxy = " + proxy.getClass());
proxy.request();
}