我们在设计API时,很可能需要使用第三方API,并将其暴露出去。但是这样做会有危险。当第三方API变化时,我们设计的API也会变化,因为是直接将第三方API暴露出去的。
例如:假设String类定义如下:
public final class String {
private final char[] chars;
public String(char[] chars) {
this.chars = chars.clone();
}
public int length() {
return chars.length;
}
public char charAt(int i) {
return chars[i];
}
}
我们使用它:
Query query = new Query();
String reply = query.computeReply();
assertEquals("Length is correct", 5, reply.length());
假设String类的length方法变成了getSize()方法,那么我们设计的API接口就变了。
对于以上问题,有三种解决方案:
1、接受它,允许我们的API随着使用并暴露出去的第三方API变化而变化;
2、拒绝它,要求你需要有权利阻止第三方API发生变化;
3、包装它,我们的API在使用第三方API时,将其包装一层。
例如:
public final class Query {
public static final class Sequence {
private String data;
Sequence(String data) {
this.data = data;
}
public int length() {
return data.length();
}
public char charAt(int i) {
return data.charAt(i);
}
}
public Sequence computeReply() {
char[] hello = { 'H', 'e', 'l', 'l', 'o' };
return new Sequence(new String(hello));
}
}
当第三方API的length()方法变成getSize()方法时:
public final class Query {
public static final class Sequence {
private String data;
Sequence(String data) {
this.data = data;
}
public int length() {
return data.getSize();
}
public char charAt(int i) {
return data.charAt(i);
}
}
public Sequence computeReply() {
char[] hello = { 'H', 'e', 'l', 'l', 'o' };
return new Sequence(new String(hello));
}
}