在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。怎样才能良好的复用这些对象,以满足我们的应用环境,这就是适配器(Adapter)所要解决的问题。
意图:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
——《设计模式》GOF
生活中的例子:
在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充 电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。
1。类的Adapter模式结构图
类结构图:
代码实现:
namespace Adapter_Pattern
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V电源类;
/// </summary>
public class Power
{
/**//// <summary>
/// 从电源中得到220V的电压;
/// </summary>
public void GetPoer220V()
{
}
}
/**//// <summary>
/// 适配器类(充电器);
/// </summary>
public class Adapter : Power, ITarget
{
/**//// <summary>
/// 得到想要电压;
/// </summary>
public void GetPower()
{
this.GetPoer220V();
Console.WriteLine("得到手机的充电电压!");
}
}
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V电源类;
/// </summary>
public class Power
{
/**//// <summary>
/// 从电源中得到220V的电压;
/// </summary>
public void GetPoer220V()
{
}
}
/**//// <summary>
/// 适配器类(充电器);
/// </summary>
public class Adapter : Power, ITarget
{
/**//// <summary>
/// 得到想要电压;
/// </summary>
public void GetPower()
{
this.GetPoer220V();
Console.WriteLine("得到手机的充电电压!");
}
}
客户端调用:
namespace Adapter_Pattern
{
class Program
{
/**//// <summary>
/// 这里相当于是手机;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手机:");
ITarget Target = new Adapter();
Target.GetPower();
Console.Read();
}
}
}
{
class Program
{
/**//// <summary>
/// 这里相当于是手机;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手机:");
ITarget Target = new Adapter();
Target.GetPower();
Console.Read();
}
}
}
特点:
它使用多继承的方式来实现,我们只需要调用得到电压(GetPower())方法,由充电器(Adapter)去将200V的电压转成我们需要的电压供我们使用。
2.对象的Adapter模式结构图
类结构图:
代码实现:
namespace Adapter_Pattern_Object_
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V电源类
/// </summary>
public class Power
{
/**//// <summary>
/// 得到220V电压;
/// </summary>
public void GetPoer220V()
{
//在这是220V的电压;
}
}
/**//// <summary>
/// 适配器类(充电器)
/// </summary>
public class Adapter : ITarget
{
Power power;
/**//// <summary>
/// 适配器的构造函数;
/// </summary>
/// <param name="power">要适配的电压</param>
public Adapter(Power power)
{
this.power = power;
}
/**//// <summary>
/// 得到想要的电压;
/// </summary>
public void GetPower()
{
power.GetPoer220V();
Console.WriteLine("得到手机的充电电压!");
}
}
}
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V电源类
/// </summary>
public class Power
{
/**//// <summary>
/// 得到220V电压;
/// </summary>
public void GetPoer220V()
{
//在这是220V的电压;
}
}
/**//// <summary>
/// 适配器类(充电器)
/// </summary>
public class Adapter : ITarget
{
Power power;
/**//// <summary>
/// 适配器的构造函数;
/// </summary>
/// <param name="power">要适配的电压</param>
public Adapter(Power power)
{
this.power = power;
}
/**//// <summary>
/// 得到想要的电压;
/// </summary>
public void GetPower()
{
power.GetPoer220V();
Console.WriteLine("得到手机的充电电压!");
}
}
}
客户端调用:
namespace Adapter_Pattern_Object_
{
class Program
{
/**//// <summary>
/// 这里相当于手机;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手机:");
Power power=new Power();
ITarget Target = new Adapter(power);
Target.GetPower();
Console.Read();
}
}
}
{
class Program
{
/**//// <summary>
/// 这里相当于手机;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手机:");
Power power=new Power();
ITarget Target = new Adapter(power);
Target.GetPower();
Console.Read();
}
}
}
总结:
对于此例子,我们要对手机充电,电力部门不可能给我们提供我们需要的电压,有时候也不一定满足我们的需要,这个就是要我们自己进行转换,这就用到适配器(Adapter)。
对软件系统中,如果要复用以前的“现存对象”,但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口,来供我们调用。
Adapter在.NET中的应用:
在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是 Oracle的数据库都要放到DataSet中。.NET中并没有提供如:SqlDataSet、OleDbDataSet、OracleDataSet 等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据;为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适 配。
DataAdapter结构图:
要点:
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
适用性:
在以下各种情况下使用适配器模式:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
总结:
总之,通过运用Adapter模式,就可以充分享受进行类库迁移、类库重用所带来的乐趣,以达到更好的复用。
轉自:http://www.cnblogs.com/houleixx/archive/2008/03/04/1090214.html