65.9K
CodeProject 正在变化。 阅读更多。
Home

适配器设计模式 (C#)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (29投票s)

2014年5月17日

CPOL

4分钟阅读

viewsIcon

107588

本文介绍了用 C# 实现的适配器模式。

引言

在本文中,我将尝试探讨一种非常有用且常用的设计模式 - “适配器模式”。我将使用 C# 语言引用我的示例。

背景

适配器模式 属于结构型设计模式。“适配器”,顾名思义,就是一个让两个互不兼容的接口能够相互通信的对象。 但是,为什么我们需要“某人”来适应某些东西? 如果您回答以下简单的问题,您就会得到答案:您在美国购买的笔记本电脑充电器具有扁平的插脚,可以轻松地插入美国的电源插座。 但是,当您去欧洲国家旅行时,电源插座可能带有圆孔。 那你该怎么办? - 简单地购买插座适配器/转换器即可。

当涉及不兼容的接口时,我们使用适配器。 我们的客户端对象想要调用一个方法,但由于我们的客户端对象可以使用的接口,与我们的客户端对象想要调用的代码不兼容,因此无法调用。 基于适配器的作用,适配器设计模式 也称为 包装器模式转换器模式。 让我们看一下适配器模式中涉及的各个参与者(对象、接口)。

ITarget: 这是客户端用来实现功能的接口。

Adaptee: 这是客户端所需的功能,但其接口与客户端不兼容。
Client: 这是希望通过使用 Adaptee 的代码来实现某些功能的类。
Adapter: 这是将实现 ITarget 并调用客户端想要调用的 Adaptee 代码的类。

使用代码

现在,让我们看一个示例,了解适配器模式的工作原理。 假设有一个 在线购物门户,它在其主页上显示要销售的产品。 这些产品来自 第三方供应商,该门户网站与该供应商合作销售产品。 第三方供应商已经建立了一个库存系统,可以提供其销售的产品列表。 在线购物门户没有可用的接口,该门户网站可以使用该接口来调用第三方供应商的库存代码。

由于我们想要调用与客户端(在线购物门户)代码不兼容的第三方供应商的代码,因此我们可以在此处应用“适配器设计模式”。 让我们首先将适配器模式的各个参与者放入我们的场景中。
ITarget: 在线购物门户网站调用以获取产品列表的方法。 在这里,获取产品列表是此门户网站想要实现的功能,并且此请求已封装在此接口中。 简而言之 - 要实现的功能通过此接口公开。
Adaptee: 第三方供应商的代码,它为我们提供了产品列表。
Adapter: 将实现 ITarget 并调用第三方供应商代码的包装器。
Client: 在线购物门户网站代码,它获取产品列表,然后显示它们。
让我们看一下演示适配器模式的代码,描述了上述场景,然后我们将重新访问各种类以将它们映射到适配器模式参与者。
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();
   }
}

在上面的代码中,参与者映射如下:ITarget:接口 ITarget Adapter:类 VendorAdapter,实现 ITarget 接口并充当 VendorAdaptee 和 ShoppingPortalClient 之间的包装器/链接。 Adaptee:类 VendorAdaptee,这是 ShoppingPortalClient 感兴趣调用的代码。 客户端:类 ShoppingPortalClient,客户端想要调用 VendorAdptee 的代码。 上面的代码是不言自明的,可以访问接口 ITarget 的客户端想要调用方法 VendorAdaptee.GetListOfProduct(),但是由于 VendorAdaptee 没有 ITarget 接口,因此需要创建一个适配器 VendorAdapter。 VendorAdapter 实现 ITarget 接口并调用 adaptee 的方法。

根据适配器调用 adaptee 的方式,它可以被称为类适配器,即当适配器使用类继承来调用 Adaptee 代码时。 当它使用对象组合来调用 adaptee 代码时,它被称为对象适配器。 例如,上面显示的 VendorAdapter 是一个对象适配器,因为它创建了 VendorAdaptee 的一个实例(对象组合)。

关注点

适配器设计模式易于实现,并确保调用现有代码,否则由于其接口不兼容而难以调用。 当必须调用遗留代码时,它非常常见。

历史

版本 1 (2014 年 5 月 16 日)

© . All rights reserved.