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