适配器模式在现代流行的框架中经常用到。
当你想用一个已经存在的类,但这个类的接口与你要求的接口不一直;或者你想创建一个与没有兼容的接口或不相关类协作的可复用的类时候,适配器模式就能派上用场。
1、适配器的故事
我们用下面的例子来展示适配器模式,这个例子的目的是将Orange适配成Apple。
如上图所示,AppleAdapter包含一个Orange的实例,并且继承自Apple。这看起来就像在Orange实例外加了一层AppleAdapter皮肤,Oranger现在就看起来像Apple实例了。
2、类图
3、实例代码
class Apple {
public void getAColor(String str) {
System.out.println("Apple color is: " + str);
}
}
class Orange {
public void getOColor(String str) {
System.out.println("Orange color is: " + str);
}
}
class AppleAdapter extends Apple {
private Orange orange;
public AppleAdapter(Orange orange) {
this.orange = orange;
}
public void getAColor(String str) {
orange.getOColor(str);
}
}
public class TestAdapter {
public static void main(String[] args) {
Apple apple1 = new Apple();
Apple apple2 = new Apple();
apple1.getAColor("green");
Orange orange = new Orange();
AppleAdapter aa = new AppleAdapter(orange);
aa.getAColor("red");
}
}
上面的例子的确是最简单的适配器模式的例子了。双向适配器可能更加比较常用些。实现一个双通道的适配器,需要实现两种接口,包含两种对象实例。不过仍然比较理解。
4、JDK中的应用
java.io.InputStreamReader(InputStream) (returns a Reader)
java.io.OutputStreamWriter(OutputStream) (returns a Writer)