代理类、包装类或外观类之间有什么不同

它们在我看来都是一样的,它们接受一个实现,封装它,然后在包装器/代理/门面类上调用方法,调用封装对象的方法.

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

谢谢

推荐答案

不同之处主要在于意图不同.归根结底,它们都"接受并包装实现",但重要的是要传达不同之处.

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

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

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

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

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

[x.x.x,)在Packages.lock.json依赖项中是什么意思?

升级到.NET8后,SignalR(在坞站容器上)网关损坏

获取Ef-Core集合的DeleteBehavior

如何将多个安装程序Bundle 到一个安装程序中?

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

AsyncLocal 的语义与逻辑调用上下文有何不同?

无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 1.1.0.0

使用 Task.Factory.StartNew 传递方法参数

什么版本的 .NET 附带什么版本的 Windows?

静态析构函数

如何异步 Files.ReadAllLines 并等待结果?

为什么 C# 不推断我的泛型类型?

Environment.GetFolderPath(...CommonApplicationData) 在 Vista 上仍然返回C:\Documents and Settings\

找不到库 hostpolicy.dll

并发字典正确用法

如何在 nuspec 中指定特定的依赖版本?

在不使用while循环的情况下找到最里面的异常?