Java虚拟字段模式

时间:2017-11-03 17:09:56

标签: java

我正在尝试理解和实现Java虚拟字段模式。到目前为止,我还没有找到很多关于它的例子或资源。这个特殊的resource解释了它,但没有明确说明它应该如何实施。有人能够更好地解释它或使用新的例子吗?

1 个答案:

答案 0 :(得分:1)

我尝试使用与链接资源中链接的mailing list类似的示例来解释模式。

假设有Peeker这样的界面:

interface Peeker<T> {
    T peek();
    T take();
}

您希望您的班级实施它,但您不想自己实现所有方法 - 您只想将所有方法调用委托给Peeker的现有实现。所以你可以写这样的课:

class Foo implements Peeker<T>{

    private Peeker<T> peeker = new PeekerImpl();

    public T peek() {
        return peeker.peek();
    }

    public T take() {
        return peeker.take();
    }
}

要避免使用此样板(特别是如果您有许多其他以类似方式使用Peeker的类),您可以使用上述模式。您可以扩展Peeker接口并使用默认方法委派所有呼叫:

interface PeekerView<T> extends Peeker<T> {

    Peeker<T> getPeeker();

    default T peek() {
        return getPeeker().peek();
    }
    default T take() {
        return getPeeker().take();
    }
}

现在界面会自动执行所有委托。您的类只需实现PeekerView接口并仅实现getPeeker方法:

class Foo implements PeekerView<T>{

    private Peeker<T> peeker = new PeekerImpl();

    public Peeker<T> getPeeker() {
        return peeker;
    }

}

要实现模式,您基本上只需将所有委托调用移至PeekerView接口的默认方法。

顺便说一句,我认为&#34;虚拟场模式&#34;,正如Brian Goetz所说的那样,并不是最好的名字。我想如果你只看一下接口就有意义 - 在这种情况下,getter就像一个虚拟字段。如果你看一下整个事情,包括实现类,它实际上就像某种 mixin (因为它也在另一个linked article中调用)。我会称之为 Mixin Pattern ,因为我已经更频繁地看到它被这个名称所引用。