c# - 适配器设计模式需要什么?

标签 c# asp.net .net design-patterns adapter

在下面的适配器设计模式示例代码中,为什么要引入一个新类而不是在客户端使用多个接口(interface)?

interface ITarget
{
  List<string> GetProducts();
}


public class VendorAdaptee
{
   public List<string> GetListOfProducts()
   {
      List<string> products = new List<string>();
      products.Add("Gaming Consoles");
      products.Add("Television");
      products.Add("Books");
      products.Add("Musical Instruments");
      return products;
   }
}


class VendorAdapter:ITarget
{
   public List<string> GetProducts()
   {
      VendorAdaptee adaptee = new VendorAdaptee();
      return adaptee.GetListOfProducts();
   }
}


class ShoppingPortalClient
{
   static void Main(string[] args)
   {
      ITarget adapter = new  VendorAdapter();
      foreach (string product in adapter.GetProducts())
      {
        Console.WriteLine(product);
      }
      Console.ReadLine();
   }
}

我有以下与上述代码相关的查询。

  • 如果 ShoppingPortalClient 直接继承 VendorAdaptee 呢?
  • 在什么情况下我们需要适配器类?
  • 为什么不是简单地继承所需的类,而是创建这种模式来访问另一个类的方法?

最佳答案

有时您有一个您无法更改的给定 API(遗留/外部库/等...)并且您想让您的能够在不更改的情况下使用该 API他们的代码。

假设您使用的 API 具有 ISomethingToSerialize

public interface ISomethingToSerialize
{
    object[] GetItemsToSerialize();
}

该 API 还有一个 Serialize 函数:

public class SerializationServices
{
    byte[] Serialize(ISomethingToSerialize objectToSerialize);
}

现在您的代码中有一个,您不想或不能更改它,我们将其命名为MyUnchangeableClass

这个 class 没有实现 ISomethingToSerialize 但你想使用 API 序列化它所以你创建 AdapterClass 它实现了 ISomethingToSerialize 以允许 MyUnchangeableClass 使用它而不用自己实现它:

public class AdapterClass : ISomethingToSerialize
{
    public AdapterClass(MyUnchangeableClass instance)
    {
        mInstance = instance;
    }

    MyUnchangeableClass mInstance;

    public object[] GetItemsToSerialize()
    {
        return mInstance.SomeSpecificGetter();
    }
}

现在你可以使用

MyUnchangeableClass instance = ... //Constructor or factory or something...
AdapterClass adapter = new AdapterClass(instance)
SerializationServices.Serialize(adapter);

序列化 MyUnchangeableClass 的实例,即使它本身不满足 API 的要求。

关于c# - 适配器设计模式需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188801/

相关文章:

c# - 这是为 POCO 实现 ObjectDataSource 排序的方式吗?

c# - DateAdd 和 DatePart 从 VB6 到 C#

c# - 通过 Javascript 更改时,HiddenField EventHandler ValueChanged 不会触发

c# - 寻找一个项目的想法

c# - Unity Xcode LowLevelCullingLoops.cpp 崩溃

c# - 重写 Url 的 .Net 3.5 Web.config - 重定向

c# - 使用 MySQL 在 ASP.NET 中登录错误

c# - 在 C# 中创建日志

c# - 混合模式程序集是针对旧版本的运行时构建的,如果没有额外的配置就无法加载

c# - Int32既然是值类型,为什么要继承.ToString()呢?