设计模式之适配器模式
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。
作用(解决的问题):Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
组成:
1、目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
2、需要适配的类(Adaptee):需要适配的类或适配者类。
3、适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
优点:
1、通过适配器,客户端可以调用统一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2、复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4、一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点:
对于对象适配器来说,更换适配器的实现过程比较复杂。
适用场景:
1、系统需要使用现有的类,而这些类的接口不符合系统的接口。
2、想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3、两个类所做的事情相同或相似,但是具有不同接口的时候。
4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
5、使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
实现:
1、类的适配器模式,使用继承实现
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { Console.WriteLine("被适配类具有 特殊功能..."); } } // 目标接口 interface Target { void Request(); } // 具体目标类,只提供普通功能 class ConcreteTarget : Target { public void Request() { Console.WriteLine("普通类 具有 普通功能..."); } } // 适配器类,继承了被适配类,同时实现标准接口 class Adapter : Adaptee, Target { public void Request() { this.specificRequest(); } } class Client { public static void Main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.Request(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(); adapter.Request(); Console.ReadKey(); } }
上面的代码我们可以通过统一接口Request()访问到普通功能和特殊功能。这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 C# 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。
2、对象适配器,采用对象组合方式实现
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { Console.WriteLine("被适配类具有 特殊功能..."); } } // 目标接口 interface Target { void Request(); } // 具体目标类,只提供普通功能 class ConcreteTarget : Target { public void Request() { Console.WriteLine("普通类 具有 普通功能..."); } } // 适配器类,直接关联被适配类,同时实现标准接口 class Adapter : Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } public void Request() { this.adaptee.specificRequest(); } } class Client { public static void Main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.Request(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(new Adaptee()); adapter.Request(); Console.ReadKey(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?