在使用Selenium WebDriver时,我注意到他们的API中有一个带有类层次结构的模式。
api的设置如下:
Interface A {
void doAStuff();
}
Interface B {
void doBStuff();
}
Interface C {
void doCStuff();
}
Class X implements A, B, C {
...
}
Class Y implements A, B, C {
...
}
Class Z implements A, B, C {
...
}
实现如下:
public void doStuffWithImplementationsOfA(A a) {
a.doAStuff();
B b = (B) a;
b.doBStuff();
C c = (C) a;
c.doCStuff();
}
public static void main(String[] args) {
A a = new X();
doStuffWithImplementationsOfA(a);
}
正如您所看到的,接口A,B和C根本不会相互扩展,但在API中,A的所有实现也实现了B和C,因此允许交叉转换。具体来说,在Selenium中,WebDriver的所有实现(如FirefoxDriver和ChromeDriver)也实现了其他几个常见的无关接口(HasInputDevices,JavascriptExecutor等);同样,WebElement的所有实现都实现了其他常见的无关接口(如Locatable)。这不仅允许,而且需要在接口之间交叉构建以访问每个实现中的各种方法。
我的问题,分三部分:
编辑:这是WebDriver API层次结构的图表(并非详尽无遗)。
答案 0 :(得分:2)
这不是new
的东西 - 它是Java中的常见机制。请查看Iterable
,Comparable
,Serializable
。许多类将实现其中的一个或多个并且工作正常。
最近,随着泛型的出现,你可以使用这样的东西更有意义并且不需要那么可怕的演员:
interface A {
void doAStuff();
}
interface B {
void doBStuff();
}
interface C {
void doCStuff();
}
public static <T extends A & B & C> void doStuff (T to) {
to.doAStuff();
to.doBStuff();
to.doCStuff();
}
这种层次结构是否有资格作为设计模式?
不是我知道的。
如果有,是否有名字?
见1.
以这种方式设计API有什么好处/缺点(而不是只使C扩展B,B扩展A)?
如果接口不是层次结构,那么没有理由这样做。请参阅上面的Iterable
和Comparable
。