注:本文为译文,原文出处java-design-patterns-in-stories
适配器模式在现代Java框架中被广泛应用.
它的场景为: 需要使用一个已经存在的类,并且它的接口与需求并不匹配; 或许你想创建一个可复用的类, 适配没有提供兼容接口的其它类。
适配器可以通过接下来这个简单的例子来加以说明. 样例的目的是将橘子适配为一个苹果.
从图中下方部分可知, 适配器包含了一个橘子的实例, 并且继承自苹果. 似乎是在橘子获取了一个适配器的”皮肤”后, 它就拥有的苹果的行为了.
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");
}
}
事实上, 这可能是适配器模式最简单的例子了. 更加常用可能是双路适配器. 如果要创建双路适配器, 需要实现2个接口并包含2个实例. 但这仍是一个简单的实现.
java.io.InputStreamReader(InputStream) (返回一个 Reader) java.io.OutputStreamWriter(OutputStream) (返回一个 Writer)
在实际中的大型框架, 这个模式的应用可能不是很明星.例如: Eclipse中适配器模式的应用就不易被发觉. 此篇文章是Escpise运行时对于适配器模式的分析.