# 适配器模式

属于结构型模式。
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有的对象与某个接口匹配。

适配器模式分为两种:类适配器模式、对象适配器模式

  • 类适配器模式:通过多重继承对一个接口与另一个接口进行匹配,但是 Java、CSharp、VB 等语言都不支持多重继承(C++ 支持),所以本篇文章不会过多介绍这种模式
  • 对象适配器模式:创建一个接口或抽象类,让子类继承它,在子类中包装需要适配的类,把源接口转成目标接口

适配器模式的.NET 应用:
在.NET 中有一个类库已经实现的、非常重要的适配器,那就是 DataAdaper DataAdapter 用作 DataSet 和数据源之间的适配器以便检索和保存数据。DataAdapter 通过映射 Fill(这更改了 DataSet 中的数据以便与数据源中的数据相匹配)和 Update(这更改了数据源中的数据以便与 DataSet 中的数据相匹配)来提供这一适配器。由于数据源可能是来自 SQL Server、Oracle、Access、MySQL,这些数据在组织上可能有不同之处,但我们希望得到统一的 DataSet(实质是 XML 数据),此时用 DataAdapter 就是非常好的手段,我们不必关注不同数据库的数据细节,就可以灵活的使用数据。

适配器不是在详细设计时添加的,而是解决已经创建的项目的问题。

# 类图

img

# 代码

# 需要适配的类

namespace StructuralPattern_AdapterPattern
{
    /// <summary>
    /// 110V 电压
    /// </summary>
    public class Voltage_110V
    {
        /// <summary>
        /// 电压
        /// </summary>
        public readonly int Voltage = 110;
    }
}

# 适配器

namespace StructuralPattern_AdapterPattern
{
    /// <summary>
    /// 电压适配器
    /// </summary>
    public abstract class VoltageAdapter
    {
        /// <summary>
        /// 获取目标电压
        /// </summary>
        /// <returns></returns>
        public abstract int GetVoltage();
    }
}
namespace StructuralPattern_AdapterPattern
{
    /// <summary>
    /// 220V 电压适配器
    /// </summary>
    public class VoltageAdapter_220V : VoltageAdapter
    {
        /// <summary>
        /// 源电压
        /// </summary>
        private Voltage_110V SourceVoltage;
        public VoltageAdapter_220V()
        {
            SourceVoltage = new Voltage_110V();
        }
        public override int GetVoltage()
        {
            Console.WriteLine("源电压:" + SourceVoltage.Voltage + "\n目标电压:220");
            return 220;
        }
    }
}

# 测试

namespace StructuralPattern_AdapterPattern
{
    public class Program
    {
        private static void Main()
        {
            VoltageAdapter voltageAdapter = new VoltageAdapter_220V();
            int temp = voltageAdapter.GetVoltage();
            Console.WriteLine("\n结果:" + temp);
        }
    }
}

运行结果:
源电压:110
目标电压:220

结果:220