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

2024-01-01

有没有具体的设计模式它描述了提供非抽象默认实现的场景,该实现使用空的 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(使用前将#替换为@)

使用空方法的默认实现的设计模式 的相关文章

随机推荐