1.概述
适配器模式(Adapter Pattern):将一个类的接口转换成用户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
又称,包装器(Wrapper)模式。既可以作为类结构型模式,也可以作为对象结构型模式;
2.结构
(1)Target(目标抽象类):定义用户所需的接口。在类结构型模式中,由于C#不支持类的多继承,它只能是接口。
(2)Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adapter和Target进行适配。在类适配器中,它通过实现Target接口并继承Adapter类使二者产生联系;在对象适配器中,它通过继承Target并关联一个Adapter对象。
(3)Adaptee(适配者类):即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。一般是具体类,并包含用户希望使用的业务方法。
3.实现
namespace Adapter
{
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void SpecificRequest()
{
}
}
//--类适配器
public class Adapter : Adaptee, ITarget
{
public void Request()
{
SpecificRequest();
}
}
//--对象适配器
public class AdapterO : ITarget
{
private Adaptee adaptee;
public AdapterO(Adaptee adaptee)
{
this.adaptee = adaptee;
}
public void Request()
{
adaptee.SpecificRequest();
}
}
public class Client
{
public void UseMethod()
{
ITarget target = new Adapter();
target.Request();
Adaptee adaptee = new Adaptee();
AdapterO adapterO = new AdapterO(adaptee);
adapterO.Request();
}
}
//--Default Adapter Pattern
public interface IServiceTarget
{
void Method1();
void Method2();
void Resquest();
}
public abstract class AbstractServiceClass : IServiceTarget
{
public void Method1()
{
}
public virtual void Method2()
{
}
public abstract void Resquest();
}
public class ConcreteServiceClass : AbstractServiceClass
{
private Adaptee adaptee;
public ConcreteServiceClass(Adaptee adaptee)
{
this.adaptee = adaptee;
}
public override void Resquest()
{
adaptee.SpecificRequest();
}
}
public class ClientDefualt
{
public void UseMethod()
{
Adaptee adaptee = new Adaptee();
IServiceTarget target = new ConcreteServiceClass(adaptee);
target.Resquest();
}
}
//--双向适配器
public class Adapter2 : Adaptee, ITarget
{
private ITarget target;
private Adaptee adaptee;
public Adapter2(ITarget target)
{
this.target = target;
}
public Adapter2(Adaptee adaptee)
{
this.adaptee = adaptee;
}
public void Request()
{
adaptee.SpecificRequest();
}
//实际使用时重写父类方法
public void SpecificRequest()
{
target.Request();
}
}
}
缺省适配器模式:当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中的每个方法提供一个默认的实现,那么该抽象类的子类可以有选择性的覆盖父类的某些方法来实现需求,它适用于不想使用一个接口的所有方法的情况,又称单接口适配器模式。
4.优缺点
(1)将目标类和适配者类解耦,无需修改原有结构。
(2)增加了类的透明性和复用性,一个适配者类可以在多个系统中复用。
(3)灵活性和拓展性都非常好。
(4)具体来说,类适配器:由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,是的适配器的灵活性更强。对象适配器:一个对象适配器可以把多个不同的适配者适配同一个目标;对象适配器模式可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据里氏代换原则,适配者的子类也可以通过该适配器进行适配。
(1)不支持多重类继承的语言,一次最多适配一个适配者。
(2)适配者不能为最终类,例如C#中不能为sealed类。
(3)单类继承的语言,类适配器中,目标抽象类只能为接口,不能为类。