适配器模式(Adapter): 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
需求: 用电源接口做例子,笔记本电脑的电源一般都是接受5V的电压,但是我们生活中的电线电压一般都是220V的输出。这个时候就出现了不匹配的状况,在软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换。在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。
- 角色:目标(Target)角色:这就是所期待得到的接口。
- 源(Adapee)角色:现在需要适配的接口。
- 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。
220V电源接口:
/**
* Adaptee 需要适配的类。
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
5V电源接口:
/**
* Target,也就是我们需要得到的接口
*/
public interface Volt5 {
int getVolt5();
}
我们的对象适配器:
public class VoltAdapter2 implements Volt5 {
Volt220 v_220;
public VoltAdapter2(Volt220 v_220) {
this.v_220 = v_220;
}
@Override
public int getVolt5() {
int power = v_220.getVolt220();
//对power进行各种修改——>5v
return 5;
}
}
或者类适配器:
public class VoltAdapter extends Volt220 implements Volt5 {
@Override
public int getVolt5() {
return 5;
}
}
运行:
public class test {
public static void main(String[] args) {
VoltAdapter adapter=new VoltAdapter();
System.out.println("输出电压:"+adapter.getVolt5());
VoltAdapter2 adapter2=new VoltAdapter2(new Volt220());
System.out.println("输出电压:"+adapter2.getVolt5());
// 输出电压:5
// 输出电压:5
}
}
类适配器和对象适配器的权衡:
类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理Adaptee的子类了。对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
对于类适配器,适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。对于对象适配器,要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。对于对象适配器,需要额外的引用来间接得到Adaptee。
建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。
本文链接:http://blog.csdn.net/ProdigalWang/article/details/77092683