| 适配器模式概述
我们联想一下常见的生活现象,我们国家的生活用电的电压是 220V,而手机,笔记本,电视机等的设备的实际工作电压没有这么高,为了使这些设备可以使用 220V 的生活用电,需要电源适配器(AC Adpater),也就是充电器或变压器,有了这个电源适配器,原本不能直接工作的生活电器等设备就可以兼容使用了,而这其中的电源适配器就充当了一个适配器的角色。
同样的在软件开发中,有时也会出现这种类似的不兼容的情况,我们也可以像引入一个电源适配器那样引入一个称之为适配器的角色来协调这些相互之间存在不兼容的结构,这种设计方案即为适配器模式。
与电源适配器相似,在适配器模式中引人了一个被称为适配器(Adapter
)的包装类,而它所包装的对象称为适配者(Adaptee
),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器让那些由于接口不兼容而不能交互的类可以一起工作。
1.1 适配器模式的定义
- 适配器模式:将一个类的接 口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
Adapter Pattern: Convert the interface of a class into another interface clients expect. Adapter lets casses work together that could't otherwise because of icompaible nteraces
.
适配器模式可以将一个类的接口和另外一个类的接口匹配起来,而无需修改原来的适配者接口和抽象目标接口类。
适配器模式的别名为包装器(Wrapper
)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。
2 | 适配器模式的结构与实现
适配器模式包括类适配器和对象适配器。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。下面分别对两种适配器进行结构分析。
2.1 适配器模式的结构
适配器模式包含以下 3
个角色
- (1) Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于 C# 语言特性单一继承和多接口扩展。
- (2) Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对 Adaptee 和 Target 进行适配。适配器 Adapter 是适配器模式的核心,在类适配器中,它通过实现 Target 接口并继承 Adaptee 类来使二者产生联系,在对象适配器中,它通过继承 Target 并关联一个 Adaptee 对象是二者产生联系。
- (3) Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,句含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码。
2.2 适配器模式的实现
由于适配器模式包括类适配器模式和对象适配器模式两种形式,下面分别介绍这两种适配器模式的实现机制。
2.2.1 类适配器
在类适配器中,适配者类 Adaptee
没有 Beavast()
方法,而客户期待这个方法,但在适配者类中实现了 SpecificRequest()
方法,该方法所提供的实现正是客户所需要的。为了使客户能够使用适配者类,提供了一个中间类,即适配磊类 Adaptee
,适配磊类实现了物象目标类接口 Target
,并继承了适配者类,在适配器类的 Reqpest()
方法中调用所继承的适配者类的 SpecificRequest()
方法,达到了适配的目的,因为适配器类与适配者类是继承关系,所以这种适配器模式称为类适配器模式。
典型的类适配器代码如下: