1.概念
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许不兼容的接口之间进行协同工作,使得原本由于接口不匹配而无法工作的类能够一起工作。
适配器模式涉及三个主要角色:
- 目标接口(Target Interface):定义客户端期望使用的接口。它是客户端代码所针对的接口。
- 被适配者(Adaptee):是需要被适配的已存在的类或接口。它定义了客户端无法直接使用的特定功能或接口。
- 适配器(Adapter):将被适配者的接口转换成目标接口的类。它实现了目标接口,并持有一个被适配者的实例,通过调用被适配者的方法来实现目标接口的方法。
2.结构图
3.示例代码
3.1 类适配器模式
在类适配器模式中,适配器类
Adapter
继承了被适配者类Adaptee
并实现了目标接口ITarget
。在适配器类中,我们重写了目标接口的方法,并在方法中调用被适配者类的特殊请求方法。客户端代码中,我们创建了一个适配器对象,并通过目标接口调用其方法,实现了适配器功能。
class Program
{
static void Main(string[] args)
{
var target = new Adapter();
target.Request();
}
}
// 目标接口
public interface ITarget
{
void Request();
}
// 被适配者
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("被适配者的特殊请求");
}
}
// 类适配器
public class Adapter : Adaptee, ITarget
{
// 重写了目标接口的方法,并在方法中调用被适配者类的特殊请求方法
public void Request()
{
Console.WriteLine("适配器转换请求");
SpecificRequest();
}
}
3.2 对象适配器模式
在对象适配器模式中,适配器类
Adapter
通过组合(持有)被适配者对象Adaptee
,将被适配者的接口转换成目标接口。适配器类实现了目标接口,并在目标接口的方法中调用被适配者对象的相应方法。客户端代码中,我们创建了一个被适配者对象Adaptee
,并将其传递给适配器对象Adapter
的构造函数。然后,我们通过目标接口调用适配器对象的方法,实现了适配器功能。
class Program
{
static void Main(string[] args)
{
var target = new Adapter(new Adaptee());
target.Request();
}
}
// 目标接口
public interface ITarget
{
void Request();
}
// 被适配者
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("被适配者的特殊请求");
}
}
// 对象适配器
public class Adapter : ITarget
{
// 保留一个对被适配者的对象引用
public Adaptee Adaptee;
public Adapter(Adaptee adaptee)
{
this.Adaptee = adaptee;
}
public void Request()
{
Console.WriteLine("对象适配器进行适配");
this.Adaptee.SpecificRequest();
}
}
4.适配器模式优缺点
4.1 优点
- 代码复用:适配器模式可以重用现有的类或接口,使其能够与其他不兼容的类或接口进行协同工作。这样可以避免重复编写相似的功能代码,提高代码复用性。
- 系统灵活性:适配器模式可以在不修改现有代码的情况下,将新的类或接口整合到系统中。这对于已经稳定运行的系统,在接口改变、第三方库集成或系统升级时非常有用,能够平滑过渡并保持灵活性。
4.2 缺点
- 增加复杂性:适配器模式引入了额外的适配器类,增加了系统的复杂性。需要仔细设计和管理适配器类的接口和关系,确保其正确性和一致性。
- 过多的适配器类:在系统中使用过多的适配器类可能导致代码混乱和维护困难。适配器模式应该谨慎使用,仅在确实需要解决不兼容接口的情况下使用,避免滥用。
5.适配器模式应用场景
- 集成第三方组件或库:当需要将现有系统与第三方组件或库进行集成时,往往存在接口不兼容的情况。适配器模式可以用于将第三方组件的接口转换成系统期望的接口,使它们能够协同工作。
- 系统升级或接口改变:当系统进行升级或者接口发生变化时,可能会导致现有代码无法正常工作。适配器模式可以用于将旧的接口转换成新的接口,以保持系统的兼容性,同时避免对已有代码的修改。
- 多态适配:在面向对象的编程中,可能存在多个类具有相似的功能,但接口不同的情况。适配器模式可以通过适配器类,将这些类的接口统一为目标接口,以实现多态适配。
- 封装有缺陷的接口:有时候使用的外部接口可能存在设计缺陷或不符合系统需要,而我们无法修改这些接口。适配器模式可以通过适配器类,在原有接口的基础上进行封装和修正,以满足系统的要求。
- 统一接口风格:在系统中可能存在多个类或接口的命名、参数等风格不统一的情况。适配器模式可以通过适配器类,对接口进行标准化和统一,提高代码的一致性和可读性。