70

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

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

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

谢谢

4

3 回答 3

64

区别主要在于意图。最终,他们都会“采取实施并包装它”,但传达差异很重要。

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

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);
  } 
}
于 2012-09-06T09:00:49.930 回答
36

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

不同之处在于它们存在的原因——它们存在的原因

代理在那里充当代表远程对象的本地对象。

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

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

于 2012-09-06T08:58:42.710 回答
8

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

正面

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

代理人

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

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

附加模式

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

  • 适配器
  • 装饰器
于 2012-09-06T12:10:06.757 回答