Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代理、包装或faç之间有什么区别;ade课程_C#_.net_Design Patterns - Fatal编程技术网

C# 代理、包装或faç之间有什么区别;ade课程

C# 代理、包装或faç之间有什么区别;ade课程,c#,.net,design-patterns,C#,.net,Design Patterns,代理类、包装类和façade类之间有什么区别 它们在我看来都是一样的,它们接受一个实现,封装它,然后在调用封装对象的方法的wrapper/proxy/facade类上调用方法 请举例说明它们的不同之处 谢谢正如您所看到的,许多设计模式都具有相同的结构 区别在于它们存在的原因——它们存在的原因 代理在那里充当表示远程对象的本地对象 包装器用于包装现有对象以扩展/更改其行为 一个外观的存在是为了简化一个复杂的API,而公开一个简单的API。区别主要在于意图。最终,他们都会“接受一个实现并包装它”,但

代理类、包装类和façade类之间有什么区别

它们在我看来都是一样的,它们接受一个实现,封装它,然后在调用封装对象的方法的wrapper/proxy/facade类上调用方法

请举例说明它们的不同之处


谢谢

正如您所看到的,许多设计模式都具有相同的结构

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

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

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


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

区别主要在于意图。最终,他们都会“接受一个实现并包装它”,但重要的是要传达差异

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

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

façade的不同之处在于它将多个类的协作隐藏在一个更简单的接口或类后面

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

好了,没有一种模式叫做包装器。看起来更像是一种行为模式的一般定义

正面

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

代理

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

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

其他模式

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

  • 适配器
  • 装饰师

你对包装器的定义不是装饰器模式吗?@Jon-有什么区别吗?我不知道这就是为什么我问这个问题,有没有一个名为
包装器的模式。这难道不只是对任何东西的定义,它包装了一个对象,使其行为略有不同(即包装器可以是装饰器/外观/代理/适配器)?@jgauffin——这也是我的印象。我不知道“包装器”设计模式。如果它不使用RPC,您会如何描述这种方法,因为目前它是一个代理,但想象一下它只是封装了一个对象,能够处理封装的对象。我想我可能仍然会称它为代理,因为它代理另一个对象的资源管理。正如你在提问中暗示的,这些并不是硬性规定。我不认为在实现上有很大的区别,但有一个意图。如果Facade在对象之间协作,那么Mediator做什么呢?我认为Facade只是包装不同的接口,并将客户端请求传递给正确的接口。如果我错了,请纠正我。另请参见,桥梁模式如何?这不属于“包装器”类型吗?