有没有具体的设计模式它描述了提供非抽象默认实现的场景,该实现使用空的 NO-OP 实现来实现接口上的所有或部分方法。这样做的目的是减轻子类实现它们自己可能不需要/使用的方法的负担:
public interface MyInterface {
public void doThis();
public void doThat();
public void done();
}
public class MyClass implements MyInterface {
public void doThis() {
// NO-OP
}
public void doThat() {
// NO-OP
}
public void done() {
// Some standard implementation
}
}
public class MuSubClass extends MyClass {
public void doThat() {
// Subclass only cares about doThat()
}
}
我已经看到这种模式使用了很多次,包括Java的SAX框架中的DefaultHandler https://docs.oracle.com/javase/8/docs/api/org/xml/sax/helpers/DefaultHandler.html, and 鼠标适配器 https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseAdapter.html。在某些情况下,此类类被命名为适配器,但我的印象是适配器模式在两个不同的接口之间进行转换。
鉴于在这些情况下,只有一个声明的接口被转换为该接口的未定义子集 - 我不清楚这如何符合适配器模式的精神。
此外,我不太明白这如何遵守空对象模式 http://en.wikipedia.org/wiki/Null_Object_pattern要么,考虑到某些方法可以有一个实现,并且 NullObject 传统上是单例。
没有用于默认实现的设计模式。
我通常会附加DoNothing
类名的前缀。根据它的意图我也使用Base
or Default
(后者被广泛使用)。大概MouseAdapter
应该被称为DefaultMouseListener
.
如果您关心的话,您可以使用简单的方法系统地存根接口动态代理 http://java.sun.com/j2se/1.4.2/docs/guide/reflection/proxy.html,您必须仅返回一个“好的”默认值(对于对象为 null,对于数字为 0 等)。
顺便说一句,这是一个非常好的问题。
EDIT
此外,这既不是Stub http://en.wikipedia.org/wiki/Method_stub or a Mock http://en.wikipedia.org/wiki/Mock_object:也许它可能与存根混淆,但意图不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)