现实需求:有两类对象数据ObjA,ObjB,ObjA来自实现了接口IA的类A,ObjB来自实现了接口IB的类B,结果现在要求把这两类数据存在一块(即来自同一类,有相同的方法)。
可是,ObjA源自接口IA,拥有自己的方法,ObjB同样。那如何实现两类对象数据又拥有相同的方法呢?适配器模式应运而生。
举例如下:学生Sjtuer到学校Xjtu做交换生,然后拿着自己在Sjtu的对象数据来到Xjtu上学,结果发现对象数据拥有的方法不同,那他的对象数据还能输入到Xjtu里吗?显然通过适配器模式可以实现,适配器模式分为两种——类适配器(继承类)和对象适配器(对象注入)。
ISjtuer接口:
package _8th_Adapter;
public interface ISjtuer {
void Age();
void Height();
}
Sjtuer实现:
public class Sjtuer implements ISjtuer {
@Override
public void Age() {
System.out.println("sjtu学生年龄是?");
}
@Override
public void Height() {
System.out.println("sjtu学生身高是?");
}
}
IXjtuer接口:
public interface IXjtuer {
void getAge();
void getHeight();
}
类适配器:
package _8th_Adapter;
/**
* 类适配器——继承Sjtuser类。
* 通过this调用父类Sjtuer中的Age(),Height()方法来实现getAge,getHeight方法,完成适配。。
* @author Administrator
*
*/
public class AdapterByClass extends Sjtuer implements IXjtuer {
@Override
public void getAge() {
this.Age();//成功将Age方法转化为目标接口中的方法——getAge方法
}
@Override
public void getHeight() {
this.Height();//成功将Height方法转化为目标接口中的方法——getHeight方法
}
}
对象适配器:
package _8th_Adapter;
/**
* 对象适配器——通过注入Sjtuer类对象。
* 通过注入的对象来调用Age和Height方法来实现getAge,getHeight方法,完成适配。
* @author Administrator
*
*/
public class AdapterByObject implements IXjtuer {
ISjtuer sjtuer = null;
public AdapterByObject(ISjtuer sjtuer) {
this.sjtuer = sjtuer;
}
@Override
public void getAge() {
sjtuer.Age();
}
@Override
public void getHeight() {
sjtuer.Height();
}
}
测试:
public static void main(String[] args) {
AdapterByClass adapter1 = new AdapterByClass();
adapter1.getAge();
AdapterByObject adapter2 = new AdapterByObject(new Sjtuer());
adapter2.getHeight();
}
其实,两个模式目的是一样的,都是为了能够在适配器类中调用需要兼容的接口的实现方法。一个通过继承,一个又一次使用了对象依赖注入(这个需要深刻理解,对你学习与编码会很有帮助)。