我们在设计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)); }}