1.概念:
适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.两种形式
a.类的适配器模式 b.对象的适配器模式
3.模拟问题:
现在假设我们的程序已经设计了接口run接口,但是现在有一个特殊的接口SpecificRun能更好的完成我们的功能,但是它和我们现有的run接口不匹配。那我们如何将它们一起工作呢?看下面的实例:
3.实例1:a.类的适配器模式
目标角色:
public interface Target {
public void run();
}
源角色:
public class Adaptee {
public void specificRun(){
System.out.println("新加的功能");
}
}
适配器角色:
public class ClassAdapter extends Adaptee implements Target {
@Override
public void run() {
this.specificRun();
}
}
用户角色:
public class TestAdapter {
public static void main(String[] args) {
ClassAdapter classAdapter = new ClassAdapter();
classAdapter.run();
}
}
运行结果:
新加的功能
3.实例2:b.对象的适配器模式
实例代码:
目标角色,源角色代码不变。
适配器角色:
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void run() {
// TODO Auto-generated method stub
adaptee.specificRun();
}
}
用户角色:
public class TestAdapter {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
ObjectAdapter objectAdapter = new ObjectAdapter(adaptee);
objectAdapter.run();
}
}
运行结果:
新加的功能
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Adapter模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。
最直接理解就是:我们需要实现某个功能,而现在实现这个功能的组件不必我们自己开发,可以通过第三方的组件来实现, 但第三方组件的接口与现在所定义的接口不一致(即类名,方法名不一样),那么在不修改两方接口的情况下,可以通过采用适配器模式来解决这一问题。
总结:根据客户端给出的组件是接口还是类,适配器通过实现接口或者继承类的方式来实现多态。 如果是实现接口,那么适配器则可以继承第三方组件,通过调用父类方法来完成功能。如果是继承,因为java中不支持多继承,适配器将具体操作委派给第三方 组件来完成。这是根据客户端给出的组件类型来区分。设计模式的原 则是:优先使用对象组合而不是类继承。这样适配器模式就很容易理解,就是客户端通过多态调用适配器,适配器通过使用第三方对象来完成具体功能。