适配器模式
装饰者模式是把相同超类型的对象包装装饰起来,赋予新的功能,与原来具有相同的超类型。而适配器模式同样也是将某些对象包装起来,只不过不再是原来的超类型,而是变成了新的类型。
适配器模式将一个类的接口,转换成期望的另一个接口。这样原本不兼容的接口可以无间的合作。
类图
组合被适配者对象接口,可以适配任意其子类。
Java示例
定义Vehicle接口
public interface Vehicle {
void drive();
}
Car实现Vehicle接口
public class Car implements Vehicle{
@Override
public void drive() {
System.out.println("I am driving a car.");
}
}
定义Bike类
public class Bike {
public void ride() {
System.out.println("I am ridding a bike.");
}
}
适配器类Adapter包装Bike,适配成接口Vehicle。将自行车Bike伪装成Vehicle。
public class Adapter implements Vehicle{
private Bike bike;
public Adapter(Bike bike){
this.bike = bike;
}
@Override
public void drive() {
bike.ride();
}
}
测试用例,在所有使用Vehicle接口对象的地方,都可以用adapter对象包装的自行车替换
public class Test {
public static void main(String[] args){
//小汽车
Vehicle v = new Car();
v.drive();
//自行车
Bike b = new Bike();
b.ride();
//适配器包装自行车,模拟汽车。
//在所有使用Vehicle接口对象的地方,都可以用adapter对象包装的自行车替换
//本质上仍然执行的是自行车的ride()方法
Vehicle adapter = new Adapter(b);
//调用汽车的drive()方法
adapter.drive();
}
}
执行结果
I am driving a car.
I am ridding a bike.
I am ridding a bike.
总结
适配器模式常常会被与装饰者模式进行区分,两者本质区别就在于适配器模式包装对象后改变为其他的接口,装饰者模式包装后仍旧是原有的接口。