使用空方法的默认实现的设计模式

tea*_*bot 21 design-patterns adapter null-object-pattern solid-principles interface-segregation-principle

是否有特定的设计模式描述了提供非抽象默认实现的场景,该实现使用空的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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经看到过这种模式多次使用,包括SAX框架中的Java的DefaultHandlerMouseAdapter.在某些情况下,这些类被命名为Adapters,但我的印象是适配器模式在两个不同的接口之间进行转换.

鉴于在这些实例中只有一个声明的接口被转换为该接口的未定义子集 - 我不清楚这是如何在适配器模式的精神.

此外,我不太明白这是如何遵循NullObject模式的,因为某些方法可能有一个实现,而NullObject传统上是一个单例.

dfa*_*dfa 5

默认实现没有设计模式。

我通常DoNothing在类名后附加前缀。根据它的意图,我也使用BaseDefault(后者被广泛使用)。大概MouseAdapter应该叫DefaultMouseListener

在您关心的情况下,您可以使用简单的DynamicProxy系统地存根接口,您必须只返回一个“不错”的默认值(对象为空,数字为 0 等)。

顺便说一句,这是一个很好的问题。

编辑

此外,这既不是Stub也不是Mock:也许它可以与 Stub 混淆,但意图不同。