一、什么是代理
举个例子,比如小明想要买房子,但是他自己由于上班没有时间,不能打乱上班的节奏,这个时候就想到了中介,小明就找到中介代替小明看房子,看好过后,小明再自己去确认并付钱,然后中介再代理小明办好手续。这就是代理,这里的中介就是代理对象,小明就是被代理对象。
代理的好处:通过代理对象间接操作被代理的目标对象,防止直接修改目标对象,通过代理对原有业务进行增强。
一、静态代理
在使用动态代理之前,我们先看看静态代理的实现。
接口:
public interface Peopleable {
void pay();
}
小明实体类,被代理:
public class XiaoMing implements Peopleable {
@Override
public void pay() {
System.out.println("小明付房款!");
}
}
静态代理(中介):
public class StaticProxy {
private Peopleable peopleable;
public StaticProxy(Peopleable peopleable) {
this.peopleable = peopleable;
}
public void pay() {
// 业务前置增强
System.out.println("中介看好房子!");
// 实际目标对象处理
peopleable.pay();
// 业务后置增强
System.out.println("中介办好手续!");
}
}
具体实现:
public class Test {
public static void main(String[] args) {
// 被代理对象
XiaoMing xiaoMing = new XiaoMing();
// 代理对象
StaticProxy staticProxy = new StaticProxy(xiaoMing);
// 执行
staticProxy.pay();
}
}
执行结果:
中介看好房子!
小明付房款!
中介办好手续!
静态代理的缺点:
- 如果这时另外一个需要租房子的也需要中介代理帮忙租房子,这个时候就需要再新增一个静态代理类来处理;
- 代码会变得很繁琐,耦合度太高,不利于扩展。
二、动态代理
动态代理:
public class DynamicProxy implements InvocationHandler {
// 目标对象
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
public Object getInstance() {
// 生成代理对象实例
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("中介看好房子!");
method.invoke(target, args);
System.out.println("中介办好手续!");
return null;
}
}
public class Test {
public static void main(String[] args) {
Peopleable peopleable = new XiaoMing();
DynamicProxy dynamicProxy = new DynamicProxy(peopleable);
Peopleable proxyInstance = (Peopleable)dynamicProxy.getInstance();
proxyInstance.pay();
}
}
执行结果:
中介看好房子!
小明付房款!
中介办好手续!
如果这个时候小红有需要租房子的找到该中介:
public interface Rentable {
void rent();
}
public class XiaoHong implements Rentable {
@Override
public void rent() {
System.out.println("小红付租金!");
}
}
还是使用DynamicProxy动态代理:
public class Test {
public static void main(String[] args) {
Peopleable peopleable = new XiaoMing();
DynamicProxy dynamicProxy = new DynamicProxy(peopleable);
Peopleable proxyInstance = (Peopleable)dynamicProxy.getInstance();
proxyInstance.pay();
System.out.println("###########");
Rentable rentable = new XiaoHong();
DynamicProxy rentProxy = new DynamicProxy(rentable);
Rentable rentProxyInstance = (Rentable)rentProxy.getInstance();
rentProxyInstance.rent();
}
}
执行结果:
中介看好房子!
小明付房款!
中介办好手续!
###########
中介看好房子!
小红付租金!
中介办好手续!
动态代理比较灵活,可扩展性高。
以上就是简单的动态代理和静态代理的使用举例,如果有理解不对的地方还望指出学习。