代理、包装器或外观类之间有啥区别

Posted

技术标签:

【中文标题】代理、包装器或外观类之间有啥区别【英文标题】:What are the differences between proxy, wrapper or a façade classes代理、包装器或外观类之间有什么区别 【发布时间】:2012-08-31 01:12:13 【问题描述】:

代理、包装器或外观类之间有什么区别

它们对我来说似乎都是一样的,它们采用一个实现,封装它,然后在调用封装对象方法的包装器/代理/外观类上调用方法。

请通过示例说明它们为何不同。

谢谢

【问题讨论】:

另见***.com/questions/350404/… The Difference Between An Adapter And A Wrapper 和 Design Patterns – Adapters and Wrappers 【参考方案1】:

如您所见,许多设计模式具有相同的结构。

区别在于它们存在的原因——它们存在的原因

代理可以充当代表远程对象的本地对象。

包装器用于包装现有对象以扩展/更改其行为。

外观的存在是为了简化复杂的 API 并改为公开一个简单的 API。

【讨论】:

你这里的包装器定义不就是装饰器模式吗? @Jon - 有什么区别? 我不知道这就是我问这个问题的原因 是否存在名为Wrapper 的模式。它不只是对包装对象以使其行为略有不同的任何东西的定义(即包装器可以是装饰器/外观/代理/适配器)? @jgauffin - 这也是我的印象。我不知道“包装器”设计模式。【参考方案2】:

区别主要在于意图。最终,它们都会“执行并包装它”,但重要的是要传达差异。

包装器模式(也称为适配器模式)采用一个接口并将其适配到另一个接口。

interface A  void Foo(); 
interface B  void Bar(); 

class AAdapter : B  
   private A a;
   public AAdapter(A a)  this.a = a; 

   void Bar() 
      a.Foo(); // just pretend foo and bar do the same thing
    

代理实现一个接口的目的是提供对其他事物(通常是大事物)的访问。一个很好的例子是远程过程调用。

interface PiCalculator 
    double CalculatePi();


class Ec2PiCalculatorProxy : PiCalculator 
    public double CalculatePi() 
       // Fire up 10000 of computers in the cloud and calculate PI
    

我们称它为代理而不是包装器,以传达它正在通过隧道连接到另一个组件以实现结果。我认为这与适配器模式不同,因为那是关于转换接口的。

外观不同,因为它将多个类的协作隐藏在一个更简单的接口或类后面。

class Facade 
  private A a;
  private B b;

  // Provides an interface to A and B by delegating to these members  

  public void DoSomethingWithAAndB() 
    MagicToken x = a.DoSomethingAndGetAResult();
    b.DoSomethingWithMagic(x);
   

【讨论】:

如果不使用 RPC,您将如何描述这种方法,因为目前它是一个代理,但想象一下它只是封装一个具有处理封装对象的能力的对象。 ***.com/a/12259840/84539 我想我可能仍然称它为代理,因为它正在代理另一个对象的资源管理。正如您在问题中暗示的那样,这些并不是硬性规定。我不认为在实现上有很大的不同,但有一个意图。 如果Facade在对象之间进行协作,那么Mediator做什么?我认为Facade只是包装不同的接口并将客户端请求传递给正确的接口。如果我错了,请纠正我。【参考方案3】:

AFAIK 没有称为包装器的模式。似乎更像是一种行为模式的通用定义。

立面

不要包装一个类,而是几个。目的是使复杂的 API 更易于使用。 .NET 示例是使用 HttpWebRequest/HttpWebResponseWebClient

代理

代理充当原始对象,但包含其他逻辑,例如处理连接或完成后清理资源。

如果您使用 WCF,您可以通过提供 WCF 服务接口来生成客户端代理。

其他模式

还有一些模式也是“包装器”:

适配器 装饰器

【讨论】:

桥接模式呢?这不属于“包装”类型吗?

以上是关于代理、包装器或外观类之间有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

装饰器、包装器和适配器模式之间有啥区别?

PHP中int和integer有啥区别?

PHP中int和integer有啥区别?

NHibernate 2.1 代理工厂选项 - 有啥区别以及选择哪个?

垫片和外观/适配器模式有啥区别?

反向代理和网关有啥区别? [复制]