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)功能增强的实现者不同 装饰者设计模式中存在装饰者基类,其并不能实现增强,而是由具体的装饰者进行增强的,所以其存在着"装饰者链"; 而静态代理中,一般不存在父子类的关系,具体的增强,就是由代理类实现的。无需其子类完成,所以不存在 链 的概念。

posted @ 2018-10-11 21:47  jxiaow  阅读(159)  评论(0编辑  收藏  举报