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

标签 c# .net design-patterns

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

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

请举例说明为什么它们不同。

谢谢

最佳答案

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

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

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),目的是提供对其他东西(通常是大东西)的访问。一个很好的例子是远程过程调用。

interface PiCalculator {
    double CalculatePi();
}

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

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

外观之所以不同,是因为它在更简单的接口(interface)或类后面隐藏了多个类的协作。

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);
  } 
}

关于c# - 代理、包装器或外观类之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296299/

相关文章:

c# - EntityFrameworkCore.Jet 在尝试连接到 MS Access DB 时返回错误

Javascript 数组总是未定义

c++ - 具有混合依赖性的 Makefile 模式规则

unit-testing - 在第三方软件 API (AutoCAD) 上进行单元测试的最佳实践

c# - 序列不包含元素 - 堆栈跟踪中没有信息

c# - 将复选框设置为只读

c# - 使用泛型在类的值类型之间进行转换

c# - StackOverFlowException - 但显然没有递归/无限循环

c# - 循环浏览以编程方式创建的文本框时出现“无法转换对象”

java - 接口(interface)隔离原理应用