初识
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构
由图可知适配器模式包含三个角色:
1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,所以它只能是接口。
2:Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
3:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
实现
static void Main(string[] args)
{
Target targer = new Target();
targer.Request();
Console.Read();
}
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
class Adaptee
{
public void SpecificRequset()
{
Console.WriteLine("特殊请求!");
}
}
class Adapter:Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecificRequset();
}
}
应用
应用一
用适配器模式模拟篮球比赛中教练分配给前锋、中锋、后卫的任务,其中包括外籍运动员(外籍运动员是听不懂教练说的英语的)。
类图
分析:
外籍球员相当于适配器模式中的适配者类,翻译者相当于适配器的角色。球员类是抽象类,类中有抽象方法,这样,子类可以重写父类中的方法。有了翻译者类,外籍球员就可以很清晰的与球员进行交流。否则,则不能。所以说,这个例子中的翻译者类,(也就是适配器模式中的适配器类)是此模式的核心部分。
应用二
我们平时用的耳机接口有2.5mm和3.5mm之分,比如我新买的耳机是2.5mm接口的,而手机的耳机孔只能插3.5mm接口的耳机。而这时我又不想重新买一个耳机,也不想换手机,这时,适配器就派上用场了。适配器就能实现2.5mm接口的耳机插在3.5mm耳机孔的手机上了。
优点
1:将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构。
2:增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一适配者类可以在多个不同的系统中复用。
3:灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,也可以在不修改原有代码的基础上 增加新的适配器,完全复合开闭原则。
缺点:
1:一次最多只能适配一个适配者类,不能同时适配多个适配者。
2:适配者类不能为最终类,在C#中不能为sealed类
3:目标抽象类只能为接口,不能为类,其使用有一定的局限性。