【问题标题】:What is the exact difference between Adapter and Proxy patterns?适配器和代理模式之间的确切区别是什么?
【发布时间】:2016-10-08 03:35:59
【问题描述】:

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

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

编辑: 我经历了this 的问题。但我更想在 Adapter 和 Proxy 之间进行仔细比较。

【问题讨论】:

标签: oop design-patterns adapter object-oriented-analysis proxy-pattern


【解决方案1】:

适配器:

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

UML 图:

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

Difference between Bridge pattern and Adapter pattern

代理:

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

UML 图:

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

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

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

主要区别:

  1. 适配器为其主题提供了不同的接口。 Proxy 提供相同的接口
  2. 适配器旨在改变现有对象的接口

您可以在proxyadapter 文章的来源制作文章中找到有关这些模式的更多详细信息。

其他有用的文章:proxy by dzone

【讨论】:

  • 非常感谢您一次又一次地改进您的答案:)
  • @Ravindrababu 您是说 Adapter 修改了原始接口,但根据 gof 和 Wikipedia 它通常用于使现有类与其他类一起工作而无需修改其源代码。请解释一下。
【解决方案2】:

来自here

适配器为其主题提供不同的接口。 Proxy 提供相同的接口。

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

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

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

【讨论】:

    【解决方案3】:

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

    适配器模式

    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

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 2021-07-21
      • 2011-04-15
      • 2017-12-03
      • 2018-10-02
      • 2016-01-19
      • 2013-03-25
      • 2016-01-19
      相关资源
      最近更新 更多