适配器模式

26 阅读5分钟

1.概念

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许不兼容的接口之间进行协同工作,使得原本由于接口不匹配而无法工作的类能够一起工作。

适配器模式涉及三个主要角色:

  1. 目标接口(Target Interface):定义客户端期望使用的接口。它是客户端代码所针对的接口。
  2. 被适配者(Adaptee):是需要被适配的已存在的类或接口。它定义了客户端无法直接使用的特定功能或接口。
  3. 适配器(Adapter):将被适配者的接口转换成目标接口的类。它实现了目标接口,并持有一个被适配者的实例,通过调用被适配者的方法来实现目标接口的方法。

2.结构图

image.png

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 优点

  1. 代码复用:适配器模式可以重用现有的类或接口,使其能够与其他不兼容的类或接口进行协同工作。这样可以避免重复编写相似的功能代码,提高代码复用性。
  2. 系统灵活性:适配器模式可以在不修改现有代码的情况下,将新的类或接口整合到系统中。这对于已经稳定运行的系统,在接口改变、第三方库集成或系统升级时非常有用,能够平滑过渡并保持灵活性。

4.2 缺点

  1. 增加复杂性:适配器模式引入了额外的适配器类,增加了系统的复杂性。需要仔细设计和管理适配器类的接口和关系,确保其正确性和一致性。
  2. 过多的适配器类:在系统中使用过多的适配器类可能导致代码混乱和维护困难。适配器模式应该谨慎使用,仅在确实需要解决不兼容接口的情况下使用,避免滥用。

5.适配器模式应用场景

  1. 集成第三方组件或库:当需要将现有系统与第三方组件或库进行集成时,往往存在接口不兼容的情况。适配器模式可以用于将第三方组件的接口转换成系统期望的接口,使它们能够协同工作。
  2. 系统升级或接口改变:当系统进行升级或者接口发生变化时,可能会导致现有代码无法正常工作。适配器模式可以用于将旧的接口转换成新的接口,以保持系统的兼容性,同时避免对已有代码的修改。
  3. 多态适配:在面向对象的编程中,可能存在多个类具有相似的功能,但接口不同的情况。适配器模式可以通过适配器类,将这些类的接口统一为目标接口,以实现多态适配。
  4. 封装有缺陷的接口:有时候使用的外部接口可能存在设计缺陷或不符合系统需要,而我们无法修改这些接口。适配器模式可以通过适配器类,在原有接口的基础上进行封装和修正,以满足系统的要求。
  5. 统一接口风格:在系统中可能存在多个类或接口的命名、参数等风格不统一的情况。适配器模式可以通过适配器类,对接口进行标准化和统一,提高代码的一致性和可读性。