为什么要使用适配器设计模式

时间:2019-04-04 00:17:54

标签: design-patterns

所以我正在研究适配器设计模式。我看到的目的是允许客户端访问其接口不兼容的类的方法。

现在我正在看this example

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 ,但由于界面不兼容而无法使用。这是我的愚蠢问题...为什么ShoppingPortalClient无法做到这一点?

var adaptee = new VendorAdaptee();

3 个答案:

答案 0 :(得分:2)

该示例实际上没有任何意义。没有必要在ShoppingPortalClient中使用适配器,因为该类不需要使用ITarget接口。

如果必须在某个地方传递ITarget,例如,如果必须在不同的类中调用performSomeOperation(ITarget),则然后创建一个适配器来通过。

答案 1 :(得分:1)

ShoppingPortalClient无法直接使用适配器,因为适配器的界面不是ITarget(它期望的)。换句话说,VendorAdaptee 没有GetProducts()方法,而有GetListOfProducts()方法。这些是不同的接口。这不适用于ShoppingPortalClient使用的现有库存管理系统。

答案 2 :(得分:0)

在示例中,主要方法(客户端或用户)正在处理类类型ITarget
主要方法不了解VendorAdaptee。

因此main方法将调用GetProducts()来获取数据。但是在我们的课堂上,我们没有它,因此无法使用它。

这是why Adapter design pattern is used。转换后,它需要类并提供为预期的格式。适配器模式也称为包装器。

将VendorAdaptee转换为ITarget并实现GetProducts()之后,我们可以使用代码。

有关更多详细信息,请访问Adapter design pattern in JavaSoftware development design patterns