适配器模式将一个类的接口转换为客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。
适配器里面也可以实现功能,称这种适配器为智能适配器。
适配器通常是一个类,一般会让适配器去实现Target接口,然后在适配器的具体实现里面调用Adaptee。
由于适配器是结构型设计模式,所以变体很多,典型的组合型,继承型,更有双向适配器模式。
下面举一个组合型的例子:
说我现在有一个客户端需要使用一个两口的插座给手机充电,但是现在只有一个三口的插座,所以客户端的需求就是希望服务端提供一个转换器,将三口插座转为两口插座,这个转换器就是适配器。
三口插座:
/*
* 被适配的对象
*/
public class Adaptee {
// 一个已经存在的功能,但是很遗憾没办法被客户使用
public void interfaceA() {
System.out.println("目前只有一个三口插座");
}
}
目标接口:
public interface Target {
// 定义接口B,可以被客户使用
void interfaceB();
}
适配器:
/**
* 这是一个适配器
* @author rao
*
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void interfaceB() {
adaptee.interfaceA();
System.out.println("这是一个可以将三口插座转为两口的转换器");
}
}
Client:
/*
* 客户
*/
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
System.out.println("客户需要一个两口的插座充电");
target.interfaceB();
System.out.println("好了,可以使用已有三口插座充电了");
}
}
上面的例子是一个典型的组合型适配器模式。这种适配器也称为对象适配器,好处是可以适配被适配者的所有子类,还有一种适配器是继承型的适配器,也称为类适配器。如下:
public class AdapterExtends extends Adaptee implements Target{
@Override
public void interfaceB() {
this.interfaceA();
System.out.println("这是一个可以将三口插座转为两口的转换器");
}
}
这种方式实现的适配器只能为单一的类进行适配,理由嘛,当然是因为java只能单继承。
还有一种双向适配器模式,顾名思义,大家都懂!有兴趣的可以移步:
http://kang.iteye.com/blog/230828