【问题标题】:Why does the proxy pattern require inheritance?为什么代理模式需要继承?
【发布时间】:2014-12-13 18:33:20
【问题描述】:

查看UML diagram on wikipedia,代理类和主题类都实现了相同的接口。

据我了解,代理类的目的是委托。这可以通过组合来完成;委托类不必实现相同的接口。

主题类是否必须实现与代理类相同的接口?

【问题讨论】:

    标签: design-patterns proxy-pattern


    【解决方案1】:

    主题类是否必须实现与代理类相同的接口?

    是的,但是 proxy 必须实现与 subject

    相同的接口

    客户端没有意识到它正在使用的实例是代理!客户认为是Subject

    【讨论】:

    • 这是否只有在涉及工厂时才有价值?如果客户端正在使用主题,然后我希望它使用代理,我该怎么做? (反之亦然)。
    • 您是正确的,为了让Client 不知道它是哪个实现,您必须向客户端提供Subject 实例(代理或真实主题)。这可以通过工厂模式完成,但也可以通过构造函数或方法调用进行依赖注入。
    • 如果客户端在该模式之前使用主题,您将必须修改客户端,以便它使用代理模式的主题抽象(看起来几乎像旧主题)。然后客户端不知道它是在与主题还是它的代理交谈。
    【解决方案2】:

    代理和主题应该提供相同的操作集。客户端无法识别请求的实例是代理还是主题。它是为它隐藏的。因此,两个类都实现了相同的接口。

    【讨论】:

      【解决方案3】:

      这更像是一个适配器(和对象适配器,使用四人帮的术语)。当您在项目后期发现需要接口适配时,通常会使用 Adapter。我相信你会预先设计代理。

      一个原因可能是代理应该对您的客户透明。如果代理具有与主题不同的接口,那么这种透明度将被打破。当不需要代理所有主题时,请考虑一个用例,例如并非所有对象都是“远程”的。

      【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2011-06-17
      • 2018-02-14
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 2010-12-07
      相关资源
      最近更新 更多