适配器模式详解

适配器模式是一种结构型设计模式,它允许两个不兼容的接口之间能够相互通信。这种模式的名称来源于生活中的一个常见例子:电源适配器。当从美国购买的笔记本电脑充电器,其插头可能与欧洲国家的电源插座不匹配,这时就需要一个电源适配器来使两者能够连接。在软件设计中,也会遇到类似的情况,即客户端对象想要调用某个方法,但该方法的接口与客户端对象不兼容。这时,适配器模式就派上了用场。

适配器模式的参与者

适配器模式中,有几个关键的参与者:

  • ITarget(目标接口):客户端用来实现功能的接口
  • Adaptee(被适配者):客户端想要使用的功能,但其接口与客户端不兼容。
  • Client(客户端):想要通过使用被适配者的代码来实现某些功能的类。
  • Adapter(适配器):实现了ITarget接口,并调用客户端想要调用的被适配者代码的类。

适配器模式的应用示例

假设有一个在线购物门户网站,它在其首页上展示销售的产品。这些产品来自一个第三方供应商,该门户网站与该供应商合作销售产品。第三方供应商已经有一个库存系统,可以提供其正在销售的产品列表。但是,对于在线购物门户网站来说,没有可用的接口来调用第三方供应商的库存代码。

在这种情况下,想要调用与客户端(在线购物门户网站)代码不兼容的第三方供应商代码,因此可以应用“适配器设计模式”。首先,来看一下适配器模式在场景中的各个参与者:

  • ITarget:在线购物门户网站调用以获取产品列表的方法。获取产品列表是这个门户网站想要实现的功能,这个请求被封装在这个接口中。简而言之,要实现的功能通过这个接口暴露出来。
  • Adaptee:第三方供应商的代码,它提供了产品列表。
  • Adapter:实现了ITarget接口,并调用第三方供应商代码的包装器。
  • Client:在线购物门户网站的代码,它获取产品列表然后展示它们。

C#语言中的适配器模式实现

下面是一个展示适配器模式的示例代码,将重新审视各种类,并将它们映射到适配器模式的参与者。

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想要调用的代码。
  • Client:类ShoppingPortalClient,客户端想要调用VendorAdaptee的代码。

上述代码是自解释的,客户端有访问ITarget接口的权限,想要调用方法VendorAdaptee.GetListOfProduct(),但由于VendorAdaptee没有ITarget接口,因此需要创建一个适配器VendorAdapter。VendorAdapter实现了ITarget接口,并调用了被适配者的方法。

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

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485