适配器和代理模式之间的确切区别是什么?

What is the exact difference between Adapter and Proxy patterns?

据我了解,AdapterProxy 模式使两个 distinct/different classes/objects 相互兼容以进行通信.它们都是 结构 模式。我发现他们两个非常相似。

谁能解释一下究竟是什么让它们与众不同?

编辑: 我完成了 this 个问题。但我更愿意对 Adapter 和 Proxy 进行仔细比较。

来自here

Adapter provides a different interface to its subject. Proxy provides the same interface.

您可能会认为适配器应该使一个东西适合另一个如果直接连接则不兼容的东西。例如,当您出国旅行时需要电源插座适配器。

现在代理是相同接口的对象,并且可能是相同的基础class(或子class)。它只是 "pretends" 成为(并且表现得像)实际对象,而是将实际行为(计算、处理、数据访问等)转发给底层的引用对象。

外推到电气类比,客户端可以看到适配器的使用 - 也就是说,客户端 "knows" 正在使用适配器 - 而代理的使用可能更经常被隐藏,或者 "transparent" - 客户认为正在使用一个实际的对象,但它只是一个代理。

适配器:

  1. 它允许两个不相关的接口通过不同的对象一起工作,可能扮演相同的角色。
  2. 修改原界面

UML 图:

您可以在此 SE post:

中通过工作代码示例找到有关此模式的更多详细信息

Difference between Bridge pattern and Adapter pattern

代理:

代理为另一个对象提供代理或占位符以控制对它的访问。

UML 图:

代理模式适用的常见情况。

  1. 虚拟代理 是 "expensive to create" 对象的占位符。真正的对象只有在客户端首先requests/accesses对象时才会创建。
  2. 远程代理 为驻留在不同地址space 的对象提供本地代表。这就是 RPC 和 CORBA 中的 "stub" 代码所提供的。
  3. 保护代理 控制对敏感主对象的访问。 "surrogate" 对象在转发请求之前检查调用者是否具有所需的访问权限。
  4. A 智能代理 提供对某些对象的复杂访问,例如跟踪对对象的引用数并在达到特定数量时拒绝访问,以及加载对象按需从数据库到内存

有关工作代码,请查看有关代理的 tutorialspoint 文章。

主要区别:

  1. 适配器为其主题提供不同的接口。 Proxy提供相同的接口
  2. 适配器用于更改现有对象的接口

您可以在 proxy and adapter 篇文章的 sourcemaking 文章中找到有关这些模式的更多详细信息。

其他有用的文章:proxy 作者 dzone

适配器模式和代理模式的区别

适配器模式

  1. 印度移动充电器 (CLIENT) 不适合美国开关板 (SERVER)。
  2. 您需要使用适配器,以便印度移动充电器 (CLIENT) 可以插入美国交换机 (SERVER)。
  3. 从第2点可以理解为CLIENT直接联系适配器。然后适配器联系服务器。

代理模式

  • 在适配器模式中,客户端直接联系适配器。它不联系服务器。
  • 在代理模式中,代理和服务器实现相同的接口。客户端会调用相同的接口。

通过代码理解

class client{
    public void main(){
      //proxy pattern
      IServer iserver = new proxy();
      iserver.invoke();

      //adapter pattern
      IAdapter iadapter = new adapter();
      iserver.iadapter();
    }
}

class server implements IServer{
    public void invoke(){}
}

class proxy implments IServer{
  public void invoke(){}
}

class adapter implements IAdapter{
  public void invoke(){}
}

参考:Difference between Adapter pattern and Proxy Pattern

在实践中,概念 wrapperadapterproxy 是如此密切相关,以至于术语可以互换使用。

  • 顾名思义,包装器实际上是包装另一个对象或函数的东西。例如调用另一个函数的函数,或管理另一个对象的生命周期并转发请求和响应的对象。

  • 适配器字面意思是适配合同。这通常是指更改对象的接口或更改方法签名。在这两种情况下,只能通过用不同的对象或函数包装它来实现。

  • 单词proxy用于完全相同的事情。但是,一些来源会更明确地使用它来引用适配器来访问远程资源。基本上,这意味着 本地调用将被转发到远程对象 。定义一个公共接口似乎很自然,然后可以 shared/reused 这些对象的本地和远程。

注意:代理模式的后一种解释不再是真正的东西了。在像 CORBA 这样的技术很热门的时代,这种方法很有意义。如果您要访问远程服务,那么明确定义请求、响应和上下文对象并使用 OpenAPI 或 XSD.

等技术会更有意义