适配器模式:将一个本不能兼容客户端的类的接口通过适配器转为可以兼容的接口。
这里有一个“中国学生接口”,定义了“说中国话”和“听中国话两个方法”
//中国学生接口
public interfaceChineseStudent {voidspeakChinese();voidlistenChinese();
}//中国学生类
public class ChineseStudent1 implementsChineseStudent {publicString name;publicChineseStudent1(String name){this.name =name;
}
@Overridepublic voidspeakChinese() {
System.out.println("学生:" + name + "说话");
}
@Overridepublic voidlistenChinese() {
System.out.println("学生:" + name + "聆听");
}
}//测试方法
public classTest {public static voidmain(String[] args) {
ChineseStudent chineseStudent= new ChineseStudent1("zhangsan");
chineseStudent.speakChinese();
chineseStudent.listenChinese();
}
}
测试结果:
学生:zhangsan说话
学生:zhangsan聆听
此时如果来了一个外国学生呢,这个外国学生不会说中文并且也听不懂中文,那么他如何去和其他中国学生交流呢,此时我们就需要一个“翻译”——适配器
//外国学生类
public classForeignStudent {privateString name;publicForeignStudent(String name){this.name =name;
}public voidspeakEnglish(){
System.out.println("学生:" + name + "说话");
}public voidlistenEnglish() {
System.out.println("学生:" + name + "聆听");
}
}
//适配器类
public class Translator implementsChineseStudent{//实例外国学生类ForeignStudent foreignStudent= new ForeignStudent("Joe");
@Overridepublic voidspeakChinese() {
foreignStudent.speakEnglish();
}
@Overridepublic voidlistenChinese() {
foreignStudent.listenEnglish();
}
}
//测试方法
public classTest {public static voidmain(String[] args) {
ChineseStudent chineseStudent= new ChineseStudent1("zhangsan");
chineseStudent.speakChinese();
chineseStudent.listenChinese();
ChineseStudent foreignStudent= newTranslator();
foreignStudent.speakChinese();
foreignStudent.listenChinese();
}
}
测试结果:
学生:zhangsan说话
学生:zhangsan聆听
学生:Joe说话
学生:Joe聆听
这样的话即使外国学生类不能直接实现“说中文”和“听中文”方法,但是通过适配器就完成了这一操作,便兼容了ChineseStudent接口。
总结:虽然适配器模式可以去兼容接口,但是这种操作通常是维护时不希望去改变兼容方与被兼容方的类时才被考虑的方法,如果在开发时能考虑到接口不兼容的问题,及时解决,通常问题就不会扩大到去兼容接口的程度。