了解Java中的代理和动态代理


代理

代理是一种设计模式。当我们想要添加或更改现有类的某些功能时,我们会创建和使用代理对象。使用代理对象而不是原始对象。通常,代理对象具有与原始对象相同的方法。在Java中,代理类通常扩展原始类。代理具有原始对象的句柄,可以对其调用该方法。

代理,在其最一般的形式中,是一个充当其他事物接口的类。通俗地说,java 中的代理类是“代替”或“代表”另一个类委派责任的类。代理模仿的对象称为实现对象。

java 中的代理类型

Java 中主要有 2 种类型的代理

  1. 静态代理
  2. 动态代理

静态代理

手动编写的代理称为静态代理。以下示例适用于 statc 代理

首先,我们可以创建一个要在代理和真实类之间共享的接口。

public interface User {
    String getType();
}

现在我们有一个接口,我们可以实现特定用户的实现。

public class FreeUser implements User {
    public String getType() {
        return "free";
    }
}

现在我们可以创建一个接口,该接口将扩展用户界面以获取其行为,这些行为可以通过其实现进行代理。Proxy

public interface ProxyUser extends User {
}

所以可以通过实施来实现FreeUserProxyProxyUser

public class FreeUserProxy implements ProxyUser {
    private FreeUser freeUser = new FreeUser();
    private static final Logger log = LoggerFactory.getLogger(FreeUserProxy.class);

    public String getType() {
        log.info("getType() called");
        return freeUser.getType();
    }
}

现在从主类运行代码

public class Day59 {
    public static void main(String [] args) {
        User user = new FreeUserProxy();
        System.out.println(user.getType());
    }
}

用法

当我们需要创建一个包装器来覆盖客户端的主对象的复杂性时,使用代理模式。此外,我们可以在代理对象上添加其他行为,以增强代理对象。

优势

  1. 代理可以隐藏复杂的任务,例如进行网络通信,事务管理,而无需更改实现。

  2. 代理可用于在实现对象之上插入自定义行为/代码,而无需更改实现对象。有时无法访问外部库的代码进行编辑,自定义行为可以在执行该库提供的方法之前/之后插入。例如,您可以为 java.net.HttpUrlConnection 类编写一个代理来记录所有外部服务调用请求,而无需更改 HttpUrlConnection 的实现。

  3. 代理模式的另一个优点是安全性。远程代理可用于在客户端中提供代理存根,并在服务器上调用实现。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/292749.html

(0)
上一篇 2022年11月8日
下一篇 2022年11月8日

相关推荐

发表回复

登录后才能评论