适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式是为了:在面向接口编程中更好的复用,如果你的系统中没有使用到面向接口编程,没有使用到多态,也不会使用到适配器模式。
在软件开发中,也就是系统的数据和行为都正确,但接口不符时,我鞥应该考虑用适配器,目的,是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口又与复用换件要求不一致的情况,比如,在需要对早期代码复用一些功能等应用上很有现实价值。
具体组成:
目标( Target)角色:定义 Client 使用的接口。
被适配( Adaptee)角色:这个角色有一个已存在并使用了的接口,而这个接口是需要我们适配的。
适配器( Adapter)角色:这个适配器模式的核心,它将被适配角色已有的接口转换为目标角色希望的接口。
在.NET中有一个类库已经实现的、非常重要的适配器,那就是DataAdapter,DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据,DataAdapter通过映射Fill(这更改了DataSet中的数据以便于数据源中的数据相匹配)和Update(这更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一适配器。
适配器模式的代码结构:
<span style="font-size:24px;">namespace 适配器模式
{
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
Console.Read();
}
}
}
//Target——这是客户所期望的接口
//目标可以是具体的,或者抽象的类,也可以是接口
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
//Adaptee——需要适配的类
class Adaptee
{
public void SpecilficRequest()
{
Console.WriteLine("特殊请求!");
}
}
//Adapter——通过在内部包装一个Adapter对象
//把源接口转换成目标接口
class Adapter : Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecilficRequest();
}
}
</span>
在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。
二者的区别:仅在于适配器角色对于被适配角色的适配,是通过继承完成的还是通过组合来完成的,通过继承完成的是类适配器模式,通过组合完成的是对象适配器模式。
由于类适配器模式通过多重继承,对一个接口与另一个接口进行匹配,而C#、VB.NET、JAVA等语言都不支持多重继承(C++)支持,也就是一个类只有一个父类,所以我们这里主要讲的是对象适配器。
使用适配器模式的情况:
使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。
两个类所做的事情相同或相似,但是具有不同的接口时要使用它,而且由于类都共享同一个接口,客户代码可以统一调用同一接口就行了,这样应该可以更简单、更直接、更紧凑。
适配器模式与代理模式的区别:
主要区别在于:代理模式应用的情况是,不改变接口命名的,而且是对已有接口功能的一种控制,而对于适配器模式来说,则强调接口转换。