陈巧倩

设计模式-适配器模式

· 219 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

Adapter适配器模式属于结构型设计模式,用来充当两个不兼容接口之间的桥梁。

Design Pattern:Adapter 🔗

基本介绍 🔗

构成 🔗

  • Target:定义Client使用的与特定功能相关的接口。
  • Adapter:将Adaptee接口适配为Target 接口。
  • Adaptee:Client所需功能的类。但其接口与客户端不兼容,需要调整的现有接口。
  • Client:与符合 Target 接口的对象协作。

优点 🔗

  • 可以在不修改原有代码的基础上来复用现有类,从而满足开闭原则。
  • 将接口或数据转换代码从程序的主要业务逻辑中分离出来,从而满足单一职责原则。
  • 可以重新定义Adaptee(被适配的类)的部分行为。

缺点 🔗

  • 代码的整体复杂度增加了,因为我们需要引入一组新的接口和类。
  • Client 和 Adaptee 在额外的需求下需要重新定义。

种类 🔗

  • 对象适配器模式:适配器实现一个对象的接口并包装另一个对象。可由所有流行的编程语言实现,它使用组合来实现功能。
  • 类适配器模式:类适配器模式与对象适配器模式的工作方式相同,只是它通过继承来处理不兼容问题。

实例 🔗

C#中适配器模式的实例,我家里有两台安卓手机分别要用USB Type-C和Micro USB来进行充电,但是我手里只有MicroUsb口的充电线,有没有发工资我也不能在去买一根TypeC口的线,只能写个适配器适配一下。

对象适配器: 🔗

class Client
{
    static void Main(string[] args)
    {
        MicroUsbTarget target = new TypeCAdapter();
        target.Recharge();
    }
}

/// <summary>
/// 目标接口
/// </summary>
public abstract class MicroUsbTarget
{
    /// <summary>
    /// 开始充电
    /// </summary>
    public virtual void Recharge()
    {
        Console.WriteLine("使用MicroUse进行充电");
    }
}

/// <summary>
/// 被适配的对象
/// </summary>
public class TypeCAdaptee
{
    /// <summary>
    /// 开始充电
    /// </summary>
    public void TypeCRecharge()
    {
        Console.WriteLine("使用TypeC也可以进行充电");
    }
}

/// <summary>
/// 适配器类
/// </summary>
public class TypeCAdapter : MicroUsbTarget
{
    private readonly TypeCAdaptee _typeCAdaptee = new TypeCAdaptee();

    /// <summary>
    /// 实现typec接口的充电
    /// </summary>
    public override void Recharge()
    {
        //具体转换工作
        _typeCAdaptee.TypeCRecharge();
    }
}

类适配器: 🔗

class Client
{
    static void Main(string[] args)
    {
        IMicroUsbTarget target = new TypeCAdapter();
        target.Recharge();
    }
}

/// <summary>
/// 目标接口
/// </summary>
interface IMicroUsbTarget
{
    /// <summary>
    /// 开始充电
    /// </summary>
    void Recharge();
}
/// <summary>
/// 被适配的对象
/// </summary>
public class TypeCAdaptee
{
    /// <summary>
    /// 开始充电
    /// </summary>
    public void TypeCRecharge()
    {
        Console.WriteLine("使用TypeC也可以进行充电");
    }
}
/// <summary>
/// 适配器类
/// </summary>
public class TypeCAdapter : TypeCAdaptee, IMicroUsbTarget
{
    /// <summary>
    /// 实现typec接口的充电
    /// </summary>
    public void Recharge()
    {
        //具体转换工作
        TypeCRecharge();
    }
}

结论 🔗

搬砖愉快!