模式简介
适配器模式是一种结构型设计模式,用于将不兼容调用者的接口适配为兼容的接口,通过适配器则可以实现调用者与不兼容系统的间接调用。举一个生活中常见的例子,用充电器给手机充电,而不是直接连一根电线直接充,家用电源220V,能带动冰箱和空调这些大功率电器,而手机明显不需要那么大的功率,而且不可能在手机上装个插头直接连接家用电源,所以通过电源适配器,既能保证稳定和安全的供电,也更加人性化。
抽象到代码中,调用者为了简化调用逻辑可能要求统一的接口,那么如果系统中需要被调用的功能模块恰好没有实现调用者要求的这种接口,同时系统复杂难以直接修改源码,那么这个时候就可以通过适配器模式来完成调用者与系统的适配。
常见的应用场景:新旧系统集成、类库适配、接口转换、框架使用、多态性适配和数据库适配等。
模式结构
-
目标接口(Target Interface): 定义客户端使用的接口,是客户端代码期望的接口。
-
被适配者(Adaptee): 需要被适配的类,其接口不符合客户端的需求。
-
适配器(Adapter): 实现目标接口,并包装了被适配者,将被适配者的接口转换成目标接口。
-
客户端(Client): 使用目标接口与适配器进行交互,不直接与被适配者交互。
工作原理
-
客户端代码通过目标接口调用适配器的方法。
-
适配器内部持有一个被适配者的实例。
-
适配器的方法内部调用被适配者的相应方法,实现了适配。
-
客户端无需知道被适配者的存在,只与适配器通过目标接口进行交互。
代码示例(C#)
提示:可在本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。
翻译器:Translator.cs
namespace AdapterPattern;
// 翻译器
interface ITranslator
{
// 翻译
string Translate(string text);
}
// 中文翻译器
class ChineseTranslator
{
public string TranslateToChinese(string text)
{
return $"中文:请通过第三方翻译SDK将文本翻译成中文.(Text:{text})";
}
}
适配器:Adapter.cs
namespace AdapterPattern;
// 中文翻译器适配器
class ChineseTranslatorAdapter : ITranslator
{
private ChineseTranslator chineseTranslator; // 中文翻译器
public ChineseTranslatorAdapter()
{
chineseTranslator = new ChineseTranslator();
}
public string Translate(string text)
{
return chineseTranslator.TranslateToChinese(text);
}
}
客户端:Client.cs
namespace AdapterPattern;
// 客户端
class Client
{
// 翻译请求
public void Request(string text, ITranslator translator)
{
Console.WriteLine(translator.Translate(text));
}
}
测试代码:Program.cs
// ************* 17.适配器模式测试 **************
using AdapterPattern;
// 创建中文翻译器适配器以兼容客户端的接口
ChineseTranslatorAdapter chineseTranslator = new ChineseTranslatorAdapter();
// 模拟客户端的翻译请求
Client client = new Client();
client.Request("Hello world!", chineseTranslator);
代码解说
上述代码模拟了客户端发起将指定文本翻译成中文的请求。客户端要求统一实现了翻译器接口的对象,那么对于原有的中文翻译器并没有实现该接口,直接修改源码又不符合开闭原则,那么就需要采用适配器模式,为原有的中文翻译器定制一个中文翻译器适配器,并且该适配器实现了翻译器接口,如此客户端便可以间接完成对原有中文翻译器的调用了。
如果这篇文章对你有帮助,请给作者点个赞吧!