适配器设计模式 (C#)






4.95/5 (29投票s)
本文介绍了用 C# 实现的适配器模式。
引言
在本文中,我将尝试探讨一种非常有用且常用的设计模式 - “适配器模式”。我将使用 C# 语言引用我的示例。
背景
适配器模式 属于结构型设计模式。“适配器”,顾名思义,就是一个让两个互不兼容的接口能够相互通信的对象。 但是,为什么我们需要“某人”来适应某些东西? 如果您回答以下简单的问题,您就会得到答案:您在美国购买的笔记本电脑充电器具有扁平的插脚,可以轻松地插入美国的电源插座。 但是,当您去欧洲国家旅行时,电源插座可能带有圆孔。 那你该怎么办? - 简单地购买插座适配器/转换器即可。
当涉及不兼容的接口时,我们使用适配器。 我们的客户端对象想要调用一个方法,但由于我们的客户端对象可以使用的接口,与我们的客户端对象想要调用的代码不兼容,因此无法调用。 基于适配器的作用,适配器设计模式 也称为 包装器模式、转换器模式。 让我们看一下适配器模式中涉及的各个参与者(对象、接口)。
ITarget: 这是客户端用来实现功能的接口。
Adapter: 这是将实现 ITarget 并调用客户端想要调用的 Adaptee 代码的类。
使用代码
现在,让我们看一个示例,了解适配器模式的工作原理。 假设有一个 在线购物门户,它在其主页上显示要销售的产品。 这些产品来自 第三方供应商,该门户网站与该供应商合作销售产品。 第三方供应商已经建立了一个库存系统,可以提供其销售的产品列表。 在线购物门户没有可用的接口,该门户网站可以使用该接口来调用第三方供应商的库存代码。
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 日)