适配器模式:将一个类的接口转换成另外一个接口,从而使得两个类可以兼容。
最容易理解的例子就是那个充电器的例子,我们国内的充电器与国外的插座并不匹配,我们用的是两头的,而国外是三头的,那如果我们去国外的时候,就需要一个中间的转换器把我们的两头充电器转换成三头的,这样就可以在国外使用了。我们说的适配器就类似于这里的这个插座转换器。
用代码示例一下吧:
这个是国内充电器可以提供的功能
public class Adaptee {
public Integer chongdianChines(){
//现有的充电器:两头
return 2;
}
}
国外充电器的功能
public interface Target {
// 国外充电器
Integer chongdianEnglish();
}
对国内的充电器进行转换得到国外充电器的功能(适配器的逻辑)
public class AdapterClass extends Adaptee implements Target{
@Override
public Integer chongdianEnglish() {
// 国内充电器
Integer chinese = chongdianChines();
// 转换一下,得到外国的充电器
Integer english = chinese + 1;
return english;
}
}
测试一下:
public class ClientClass {
public static void main(String[] args) {
AdapterClass adpater = new AdapterClass();
Integer integer = adpater.chongdianEnglish();
System.out.println("得到国外充电器:"+integer);
}
}
这是适配器的一种方式,叫类适配器,可以看到,适配器类需要继承自被适配类,还有另外一种方式是对象适配器,不需要再继承自被适配的类,只需要把被适配的类作为适配器类的一个属性,这样使用起来也更加灵活
public class AdapterObject implements Target{
// 被适配类
private Adaptee adaptee;
public AdapterObject(Adaptee adaptee) {
this.adaptee = adaptee;
}
// 适配的逻辑
@Override
public Integer chongdianEnglish() {
// 得到国内充电器
Integer chinese = adaptee.chongdianChines();
// 转换一下得到国外充电器
Integer english = chinese + 1;
return english;
}
}
测试一下,也可以达到同样的效果
public class ClientObject {
public static void main(String[] args) {
// 创建适配器类对象的时候,需要先创建一个被适配类的对象作为属性值传进去
AdapterObject adapterObject = new AdapterObject(new Adaptee());
Integer integer = adapterObject.chongdianEnglish();
System.out.println("得到国外充电器:"+integer);
}
}
小结一下:这个例子很容易理解。适配器模式的主要功能就是整合,把提供不同功能的类整合到一起,但其实这里的不同功能也不是完全不同,还是有一些共通性的。比如我有一个工程管理的系统,因为使用场景与一些法令法规使得国外与国内并不能通用,但是本身功能又是相同的,这个时候如果想把国外的也整合到国内的系统中来,那么我们就可以使用这种适配器模式来对其中有差异的部分进行整合。