定义
适配器模式:将一个类的接口转换成客户希望的另一个接口。
适配器模式让那些接口不兼容的类可以一起工作。
举例
常见的就是电源适配器,生活用电电压是220V,而笔记本电脑、手机等所需电压没有这么高,就需要电源适配器进行转换了
结构
类适配器模式和对象适配器模式
- (1)
Target
(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,它只能是接口。 - (2)
Adapter
(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。 - (3)
Adaptee
(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码。
实现
对象适配器
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求");
}
}
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}
/// <summary>
/// 对象适配器
/// </summary>
class Adapter: Target
{
private Adaptee adaptee = new Adaptee();
//表面上是调用Request,其实是调用SpecificRequest
public override void Request()
{
adaptee.SpecificRequest();
}
}
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
}
}
类适配器
interface ITarget
{
void Request();
}
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}
// 类适配器
class Adapter : Adaptee,ITarget
{
//表面上是调用Request,其实是调用SpecificRequest
public void Request()
{
base.SpecificRequest();
}
}
class Program
{
static void Main(string[] args)
{
Adapter adapter = new Adapter();
adapter.Request();
}
}
优点
- (1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
- (2)增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
- (3)灵活性和扩展性都非常好
对象适配器优点
- (1)一个对象适配器可以把多个不同的适配者适配到同一个目标。
- (2)对象适配器模式可以适配一个适配者的子类
缺点
- (1)对于C#、Java等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者。
- (2)适配者类不能为最终类,例如在C#中不能为sealed类。
- (3)在C#、Java等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
对象适配器缺点
与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦。
适用环境
- (1)系统需要使用一些现有的类,而这些类的接口(例如方法名)不符合系统的需要,甚至没有这些类的源代码。
- (2)创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作。