在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
基本概念
客户:需要调用我们的代码的对象。
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
主要内容
(1)类适配器:
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
下面是类适配器的UML图:
(2)对象适配器:
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:
(3) 缺省适配器模式:
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。
示范代码:
原先只有生产三星电视的类:
package test.edu.adaptee;
public class SamSungTV {
public void createSamSungTV(){
System.out.println("生产了三星电视机");
}
}
现在客户要求不仅要能生产三星电视 还有能生产长虹电视:
那么为了不影响原来三星电视的生产线,我们需要加上一条新的生产线生产长虹电视,这时候可以考虑用适配的方式添加一层适配层,客户直接访问适配层,想要那个电视就选那个:
为客户提供的接口:
package test.edu.adaptee;
public interface TargetInterface {
public void createSamSungTV();
public void changHongTV();
}
具体的适配器类:
package test.edu.adaptee;
public class Adapter extends SamSungTV implements TargetInterface {
@Override
public void changHongTV() {
// TODO Auto-generated method stub
System.out.println("生产了长虹电视机");
}
}
客户端:
package test.edu.adaptee;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
TargetInterface ad = new Adapter();
ad.createSamSungTV();
ad.changHongTV();
}
}
新的接口:
package test.edu.adaptee;
public interface TargetInterface2 extends TargetInterface {
public void createHaiXinTV();
}
新的适配器:
package test.edu.adaptee;
public class Adapter2 extends Adapter implements TargetInterface2 {
@Override
public void createHaiXinTV() {
// TODO Auto-generated method stub
System.out.println("生产了海信电视");
}
}
客户端:
package test.edu.adaptee;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("===适应客户1的要求===");
TargetInterface ad = new Adapter();
ad.createSamSungTV();
ad.changHongTV();
System.out.println("===适应客户2的要求===");
TargetInterface2 ad1 = new Adapter2();
ad1.createSamSungTV();
ad1.changHongTV();
ad1.createHaiXinTV();
}
}
结果:
===适应客户1的要求===
生产了三星电视机
生产了长虹电视机
===适应客户2的要求===
生产了三星电视机
生产了长虹电视机
生产了海信电视