繁体   English   中英

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

[英]What is the exact difference between Adapter and Proxy patterns?

据我了解,适配器代理模式都使两个不同/不同的类/对象彼此兼容以进行通信。 它们都是结构模式。 我发现他们两个彼此非常相似。

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

编辑:我经历了这个问题。 但我更愿意对 Adapter 和 Proxy 进行仔细比较。

适配器:

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

UML图:

在此输入图像描述

您可以通过此SE帖子中的工作代码示例找到有关此模式的更多详细信息:

桥模式和适配器模式之间的差异

代理:

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

UML图:

在此输入图像描述

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

  1. 虚拟代理是“创建昂贵”对象的占位符。 仅在客户端首次请求/访问对象时才创建真实对象。
  2. 远程代理为驻留在不同地址空间中的对象提供本地代表。 这就是RPC和CORBA中提供的“存根”代码。
  3. 保护代理控制对敏感主对象的访问。 “代理”对象在转发请求之前检查调用者是否具有所需的访问权限。
  4. 智能代理提供对某些对象的复杂访问,例如跟踪对象的引用数量,如果达到某个数量则拒绝访问,以及根据需要将数据库中的对象加载到内存中

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

主要差异:

  1. 适配器为其主题提供不同的界面。 代理提供相同的接口
  2. 适配器旨在更改现有对象的接口

您可以在代理适配器文章的sourcemaking文章中找到有关这些模式的更多详细信息。

其他有用的文章:dzone 代理

这里

适配器为其主题提供不同的界面。 代理提供相同的接口。

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

现在,Proxy是同一接口的对象,可能是相同的基类(或子类)。 它只是“假装”成为(并且表现得像)实际对象,而是将实际行为(计算,处理,数据访问等)转发给底层的引用对象。

根据电气类比推断,客户端可以看到适配器的使用 - 也就是说,客户端“知道”正在使用适配器 - 而代理的使用可能更常被隐藏,或者“透明“ - 客户端认为正在使用实际对象,但它只是一个代理。

在实践中,包装器适配器代理的概念是如此密切相关,以至于这些术语可以互换使用。

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

  • 适配器从字面上适应合同。 这通常是指更改 object 的接口,或更改方法签名。 在这两种情况下,这只能通过用不同的 object 或 function 包装来实现。

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

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

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

适配器模式

  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(){}
}

参考: 适配器模式和代理模式之间的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM