代理是一种设计模式。当我们想要添加或更改现有类的某些功能时,我们会创建和使用代理对象。使用代理对象而不是原始对象。通常,代理对象具有与原始对象相同的方法。在Java中,代理类通常扩展原始类。代理具有原始对象的句柄,可以对其调用该方法。
代理,在其最一般的形式中,是一个充当其他事物接口的类。通俗地说,java 中的代理类是“代替”或“代表”另一个类委派责任的类。代理模仿的对象称为实现对象。
Java 中主要有 2 种类型的代理
手动编写的代理称为静态代理。以下示例适用于 statc 代理
首先,我们可以创建一个要在代理和真实类之间共享的接口。
public interface User { String getType(); }
现在我们有一个接口,我们可以实现特定用户的实现。
public class FreeUser implements User { public String getType() { return "free"; } }
现在我们可以创建一个接口,该接口将扩展用户界面以获取其行为,这些行为可以通过其实现进行代理。Proxy
public interface ProxyUser extends User { }
所以可以通过实施来实现FreeUserProxy
ProxyUser
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()); } }
当我们需要创建一个包装器来覆盖客户端的主对象的复杂性时,使用代理模式。此外,我们可以在代理对象上添加其他行为,以增强代理对象。
代理可以隐藏复杂的任务,例如进行网络通信,事务管理,而无需更改实现。
代理可用于在实现对象之上插入自定义行为/代码,而无需更改实现对象。有时无法访问外部库的代码进行编辑,自定义行为可以在执行该库提供的方法之前/之后插入。例如,您可以为 java.net.HttpUrlConnection 类编写一个代理来记录所有外部服务调用请求,而无需更改 HttpUrlConnection 的实现。
代理模式的另一个优点是安全性。远程代理可用于在客户端中提供代理存根,并在服务器上调用实现。