代理模式

简单来说, 代理是指代表另一个对象的对象。
根据GoF, 代理模式“为访问原始对象提供了控制”。
因此, 我们可以执行许多操作, 例如隐藏原始对象的信息, 按需加载等。
代理模式也称为代理或占位符。
RMI API使用代理设计模式。存根和骨架是RMI中使用的两个代理对象。 代理模式的优势

  • 它为外界的原始物体提供了保护。
代理模式的用法: 它用于:
  • 可以在虚拟代理方案中使用它-考虑一下存在多个数据库调用以提取大尺寸图像的情况。由于这是一项昂贵的操作, 因此在这里我们可以使用代理模式, 该模式将创建多个代理并指向巨大的内存消耗对象以进行进一步处理。仅当客户端首先请求/访问该对象时, 才创建真实对象, 然后, 我们可以仅引用代理来重用该对象。这避免了对象的重复, 从而节省了内存。
  • 它可以在保护代理方案中使用-它用作授权层, 以验证实际用户是否可以访问适当的内容。例如, 代理服务器提供对办公室中Internet访问的限制。仅允许使用有效的网站和内容, 其余的将被阻止。
  • 可以在远程代理方案中使用它-在RPC调用中可以考虑使用远程代理。远程代理提供了存在于不同地址位置中的对象的本地表示。另一个示例可以是为远程资源(例如Web服务或REST资源)提供接口。
  • 它可以在智能代理方案中使用– 智能代理通过在访问对象时插入特定操作来提供附加的安全层。例如, 在访问真实对象之前检查其是否已锁定, 以便其他任何对象都无法更改它。
代理模式示例
让我们通过上面的UML图了解代理设计模式的示例。
代理模式的UML:
代理模式

文章图片
以上UML的实现: 步骤1 创建一个OfficeInternetAccess接口。
public interface OfficeInternetAccess { public void grantInternetAccess(); }

第2步 创建一个RealInternetAccess类, 该类将实现OfficeInternetAccess接口以向特定员工授予权限。
public class RealInternetAccess implements OfficeInternetAccess { private String employeeName; public RealInternetAccess(String empName) { this.employeeName = empName; } @Override public void grantInternetAccess() { System.out.println("Internet Access granted for employee: "+ employeeName); } }

第三步 创建一个ProxyInternetAccess类, 该类将实现OfficeInternetAccess接口, 以提供RealInternetAccess类的对象。
public class ProxyInternetAccess implements OfficeInternetAccess { private String employeeName; private RealInternetAccessrealaccess; public ProxyInternetAccess(String employeeName) { this.employeeName = employeeName; } @Override public void grantInternetAccess() { if (getRole(employeeName) > 4) { realaccess = new RealInternetAccess(employeeName); realaccess.grantInternetAccess(); } else { System.out.println("No Internet access granted. Your job level is below 5"); } } public int getRole(String emplName) { // Check role from the database based on Name and designation // return job level or job designation. return 9; } }

步骤4 【代理模式】现在, 创建一个可以实际访问Internet的ProxyPatternClient类。
public class ProxyPatternClient { public static void main(String[] args) { OfficeInternetAccess access = new ProxyInternetAccess("Ashwani Rajput"); access.grantInternetAccess(); } }

输出量
No Internet access granted. Your job level is below 5

    推荐阅读