适配器模式
1.适配器模式概述
与电源适配器类似,在适配器模式中引入了一个被称为适配器的包装类。而它所包装的对象称为适配者。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说,当客户类调用适配器的方法时在适配器类的内部将调用适配者类的方法,而这个过程对用户是透明的,客户类并不直接访问适配者类。因此,适配器让那些由于接口不兼容而不能交互的类可以一起工作。
定义如下:
适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,又可以作为对象结构型模式。在适配器模式的定义中所提及的接口是广义的接口,它可以表示一个方法或者方法的集合。
2.适配器模式结构
适配器模式包括类适配器和对象适配器。在对象适配器中,适配器与适配者是关联关系;在类适配器中,适配器与适配者是继承或实现关系。下面分别分析两种适配器模式的结构。
2.1类适配器结构图
2.2对象适配器
适配器模式包含以下三个角色
- Target(目标抽象类):目标抽象类定义客户所需要的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Java语言不支持多继承,它只能是接口。
- Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使两者产生联系,在对象适配器中,它通过继承Target并关联一个Adaptee对象来使两者产生联系。
- Adaptee(适配者类):适配者类即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体的实体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码。
3.适配器模式实现
3.1类适配器
如上图,在适配者类中没有request()方法,而客户期待这个方法,但在适配者类中实现了specificRequest()方法,该方法提供的实现正是客户端所需要的。为了使客户能够使用适配者类,提供一个中间类,即适配器Adapter,适配器实现了抽象目标类接口Target,并继承了适配者类,在适配器类的request()方法中调用所继承的specificRequest()方法,达到了适配的目的。典型类适配器代码如下:
public class Adapter extends Adaptee implements Target {
public void request(){
super.specificRequest();
}
}
3.2对象适配器
为了使客户端能够使用适配者类,需要使用适配器类包装一个适配者类的实例,从而将客户端与适配者类衔接起来,在适配器的request()方法调用适配者的specificRequest()方法。适配者与适配器为关联关系。典型对象适配器代码如下:
public class Adatper extends Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee=adaptee;
}
public void request()