📜  代理设计模式

📅  最后修改于: 2021-09-10 02:43:21             🧑  作者: Mango

Proxy 的意思是“代替”、“代表”或“代替”或“代表”是代理的字面量意思,直接解释了代理设计模式
代理也称为代理、句柄和包装器。它们在结构上与适配器和装饰器密切相关,但与目的无关。

一个现实世界的例子可以是支票或信用卡是我们银行账户中内容的代理。它可以代替现金使用,并在需要时提供一种获取现金的方式。而这正是代理模式所做的——“控制和管理对它们所保护的对象的访问”。

行为

与装饰器模式一样,代理可以链接在一起。客户端和每个代理都认为它正在将消息委托给真实服务器:

什么时候使用这种模式?

当我们需要创建一个包装器来覆盖来自客户端的主要对象的复杂性时,使用代理模式。

代理类型

远程代理:
它们负责表示位于远程的对象。与真实对象交谈可能涉及数据的编组和解组以及与远程对象交谈。所有这些逻辑都封装在这些代理中,客户端应用程序无需担心它们。

虚拟代理:

如果真实对象需要一些时间来产生结果,这些代理将提供一些默认的和即时的结果。这些代理启动对真实对象的操作并向应用程序提供默认结果。一旦真实对象完成,这些代理将实际数据推送到客户端,在那里它之前提供了虚拟数据。

保护代理:

如果应用程序无权访问某些资源,则此类代理将与有权访问该资源的应用程序中的对象对话,然后返回结果。

智能代理:

智能代理通过在访问对象时插入特定操作来提供额外的安全层。一个例子是在访问真实对象之前检查它是否被锁定,以确保没有其他对象可以更改它。

一些例子

一个非常简单的现实生活场景是我们的大学互联网,它限制了很少的站点访问。代理首先检查您要连接的主机,如果它不是受限站点列表的一部分,则它连接到真实的互联网。此示例基于保护代理。

让我们看看它是如何工作的:

互联网接口

package com.saket.demo.proxy;
  
public interface Internet
{
    public void connectTo(String serverhost) throws Exception;
}

真正的互联网。Java

package com.saket.demo.proxy;
  
public class RealInternet implements Internet
{
    @Override
    public void connectTo(String serverhost)
    {
        System.out.println("Connecting to "+ serverhost);
    }
}

代理互联网。Java

package com.saket.demo.proxy;
  
import java.util.ArrayList;
import java.util.List;
  
  
public class ProxyInternet implements Internet
{
    private Internet internet = new RealInternet();
    private static List bannedSites;
      
    static
    {
        bannedSites = new ArrayList();
        bannedSites.add("abc.com");
        bannedSites.add("def.com");
        bannedSites.add("ijk.com");
        bannedSites.add("lnm.com");
    }
      
    @Override
    public void connectTo(String serverhost) throws Exception
    {
        if(bannedSites.contains(serverhost.toLowerCase()))
        {
            throw new Exception("Access Denied");
        }
          
        internet.connectTo(serverhost);
    }
  
}

客户。Java

package com.saket.demo.proxy;
  
public class Client
{
    public static void main (String[] args)
    {
        Internet internet = new ProxyInternet();
        try
        {
            internet.connectTo("geeksforgeeks.org");
            internet.connectTo("abc.com");
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

由于其中一个站点在被禁止的站点中被提及,所以
运行程序将给出输出:

Connecting to geeksforgeeks.org
Access Denied

好处:

  • 代理模式的优势之一是安全性。
  • 这种模式避免了可能是巨大尺寸和内存密集型的对象的重复。这反过来又提高了应用程序的性能。
  • 远程代理还通过在客户端机器中安装本地代码代理(存根),然后借助远程代码访问服务器来确保安全性。

缺点/后果:

此模式引入了另一层抽象,如果 RealSubject 代码由某些客户端直接访问并且其中一些可能访问 Proxy 类,则有时可能会出现问题。这可能会导致不同的行为。

有趣的点:

  • 相关模式之间几乎没有区别。就像适配器模式为其主题提供了不同的接口,而代理模式提供了与原始对象相同的接口,但装饰器提供了增强的接口。装饰器模式在运行时添加额外的行为。
  • Java API 中使用的代理: Java.rmi.*;