Java中代理对象
静态代理
静态代理通常用于对原有业务逻辑的扩充 ,通过对真实对象的封装,来实现扩展性。
三要素:
共同接口
public interface Action{
void doSomething();
}
真实对象
public class RealObject implements Action{
public void doSomething(){
System.out.println("do somethings");
}
}
代理对象
public class Proxy implements Action{
private Action action;
public Proxy(){
this.action = RealObject()
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
动态代理
基本用法:
public class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理扩展逻辑
System.out.println("proxy do");
return method.invoke(realObject, args);
}
}
public static void main(String[] args) {
RealObject realObject = new RealObject();
Action proxy = (Action) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Action.class}, new DynamicProxyHandler(realObject));
proxy.doSomething();
}
静态代理类与装饰者模式进行对比
- 静态代理类与装饰者之间的共同点:
(1)都要实现与目标类相同的业务接口
(2)在俩个类中都要声明目标对象
(3)都可以在不修改目标类的前提下增强目标方法
-
静态代理类与装饰者,之间的不同点:
(1)目的不同,装饰者,简单说,就是为了增强目标对象 ; 静态代理的使用目的是为了保护和隐藏目标对象
(2)对于目标对象的获取方式不同: 装饰者中目标对象的获取,通过代参构造器传入,静态代理类中,是在无参构造器中直接创建。
(3)功能增强的实现者不同 装饰者设计模式中存在装饰者基类,其并不能实现增强,而是由具体的装饰者进行增强的,所以其存在着"装饰者链"; 而静态代理中,一般不存在父子类的关系,具体的增强,就是由代理类实现的。无需其子类完成,所以不存在 链 的概念。