把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
模式中的角色:
适配器模式有类的适配器模式和对象的适配器模式两种形式,下面我们分别讨论这两种形式的实现
具体实现代码如下:
/// <summary>
/// 目标接口(C#不支持类的多继承,故此处定义为接口)
/// </summary>
public interface ITarget
{
    void Request();
}
/// <summary>
/// 定义需要适配的类
/// </summary>
public class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("This is a special request.");
    }
}
/// <summary>
/// 定义适配器,继承适配的类和目标接口
/// </summary>
public class PowerAdapter_Class : Adaptee, ITarget
{
    /// <summary>
    /// 实现目标接口方法
    /// </summary>
    public void Request()
    {
        this.SpecificRequest();
    }
}
/// <summary>
/// 客户端调用
/// </summary>
static void Main(string[] args)
{
    ITarget target = new PowerAdapter_Class();
    target.Request();
    Console.ReadLine();
}
从上面代码中可以看出,客户端希望调用Request方法(即三个孔插头),但是我们现有的类(即2个孔的插头)并没有Request方法,它只有SpecificRequest方法(即两个孔插头本身的方法),然而适配器类(适配器必须实现三个孔插头接口和继承两个孔插头类)可以提供这种转换,它提供了Request方法的实现(其内部调用的是两个孔插头,因为适配器只是一个外壳罢了,包装着两个孔插头(因为只有这样,电器才能使用),并向外界提供三个孔插头的外观,)以供客户端使用,对应类图如下:
具体实现代码如下:
/// <summary>
/// 适配器模式中的目标(Target)角色
/// </summary>
public class Target
{
    /// <summary>
    /// 使用virtual修饰以便子类可以重写
    /// </summary>
    public virtual void Request()
    {
        Console.WriteLine("This is a common request");
    }
}
/// <summary>
/// 定义需要适配的类
/// </summary>
public class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("This is a special request.");
    }
}
/// <summary>
/// 定义适配器继承目标类
/// </summary>
public class PowerAdapter_Object : Target
{
    public Adaptee adaptee = new Adaptee();
    public override void Request()
    {
        adaptee.SpecificRequest();
    }
}
/// <summary>
/// 客户端调用
/// </summary>
static void Main(string[] args)
{
    Target target = new PowerAdapter_Object();
    target.Request();
    Console.ReadLine();
}
一目了然,在适配器类中创建需要适配的对象,并通过对象调用指定方法以达到适配的目的。对应类图如下:
类的适配器模式:
优点:
缺点:
对象的适配器模式:
优点:
缺点:
在以下情况下可以考虑使用适配器模式:
.NET中的一个重要适配器模式的应用就是DataAdapter。ADO.NET为统一的数据访问提供了多个接口和基类,其中最重要的接口之一是IdataAdapter。DataAdpter起到了数据库到DataSet桥接器的作用,使应用程序的数据操作统一到DataSet上,而与具体的数据库类型无关。甚至可以针对特殊的数据源编制自己的DataAdpter,从而使我们的应用程序与这些特殊的数据源相兼容。
原文:http://www.cnblogs.com/snaildev/p/7610426.html