c#设计模式 适配器模式详细介绍


适配器模式(Adapter Pattern)是一种结构型设计模式,它允许对象之间的接口不兼容时,通过一个中间的适配器类来协调,使得原本接口不兼容的类可以一起工作。在C#中,适配器模式常用于解决不同类库、框架或新旧系统之间的接口不匹配问题。

### 适配器模式的核心思想

- **转换接口**:将一个类的接口转换成客户端所期待的另一种接口形式,使原本接口不兼容的类可以一起工作。

- **解耦**:通过引入适配器类,可以在不修改原有代码的基础上,增加新的接口功能,从而实现了类之间的解耦。

### 适配器模式的结构

适配器模式主要包含以下三个角色:

1. **目标接口(Target)**:客户所期待的接口。目标可以是抽象类或接口,也可以是具体的类。

2. **需要适配的类(Adaptee)**:现存的需要适配的接口。

3. **适配器类(Adapter)**:通过包装一个需要适配的对象,把原有接口转换成目标接口。

### 适配器模式的实现

在C#中,适配器模式可以通过类适配器或对象适配器来实现。

#### 类适配器

类适配器通过多重继承对一个接口与另一个接口进行匹配。由于C#不支持多重继承(除了接口的多重继承),因此类适配器在C#中通常通过实现接口和继承类的方式来实现。


// 目标接口
public interface ITarget
{
    void Request();
}

// 需要适配的类
public class Adaptee
{
    public void SpecificRequest()
    {
        // 具体的功能实现
        Console.WriteLine("Called SpecificRequest()");
    }
}

// 适配器类
public class Adapter : Adaptee, ITarget
{
    public void Request()
    {
        // 调用需要适配的类的方法
        this.SpecificRequest();
    }
}

// 客户端代码
public class Client
{
    public static void Main()
    {
        ITarget target = new Adapter();
        target.Request(); // 输出: Called SpecificRequest()
    }
}

#### 对象适配器

对象适配器通过组合的方式,将对象的接口转换成另一个接口。这种方式更加灵活,因为它不需要继承Adaptee类。


// 目标接口和需要适配的类与上面相同

// 适配器类
public class ObjectAdapter : ITarget
{
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee)
    {
        this.adaptee = adaptee;
    }

    public void Request()
    {
        // 调用需要适配的类的方法
        adaptee.SpecificRequest();
    }
}

// 客户端代码
public class Client
{
    public static void Main()
    {
        Adaptee adaptee = new Adaptee();
        ITarget target = new ObjectAdapter(adaptee);
        target.Request(); // 输出: Called SpecificRequest()
    }
}

### 适配器模式的应用场景

- 当你想使用一个已经存在的类,而它的接口不符合你的需求时。

- 当你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)一起工作时。

- 当你想使用一个类的库,但是接口与你期望的不一致时。

通过适配器模式,你可以在不修改原有代码的基础上,灵活地扩展系统的功能,提高系统的可维护性和可扩展性。