代理,包装器或façade类之间有什么区别

Jon*_*Jon 50 .net c# design-patterns

代理,包装器或façade类之间有什么区别

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

请说明为什么它们与示例不同.

谢谢

Jef*_*ter 49

差异主要在于意图.最终,他们都做"采取实施并包装",但重要的是传达差异.

包装器模式(也称为适配器模式)采用一个接口并使其适应另一个接口.

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
   } 
}
Run Code Online (Sandbox Code Playgroud)

代理实现了一个接口,用于提供对其他东西的访问(通常是大的东西).一个很好的例子是远程过程调用.

interface PiCalculator {
    double CalculatePi();
}

class Ec2PiCalculatorProxy : PiCalculator {
    public double CalculatePi() {
       // Fire up 10000 of computers in the cloud and calculate PI
    }
}
Run Code Online (Sandbox Code Playgroud)

我们将其称为代理而不是包装器来表示它正在通过隧道传输到另一个组件来实现结果.我没有看到这与适配器模式相同,因为那是关于转换接口.

外观不同,因为它隐藏了更简单的接口或类背后的多个类的协作.

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);
  } 
}
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 27

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

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

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

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

存在简化复杂API并展示简单API的外观.

  • 是否有一个名为`Wrapper`的模式.是不只是包装对象的任何东西的定义使它的行为略有不同(这是一个包装器可以是装饰器/外观/代理/适配器)? (4认同)
  • 我不知道这就是我问这个问题的原因 (3认同)
  • @jgauffin-这也是我的印象。我不知道“包装”设计模式。 (2认同)

jga*_*fin 7

AFAIK没有一种叫做包装的模式.似乎更像是一种行为模式的通用定义.

正面

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

代理

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

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

其他模式

还有一些模式也是"包装":

  • 适配器
  • 装饰