我试图扩展一些使用复合模式实现树的现有代码。正如预期的那样,有一个界面
(Node
)和表示通用节点的抽象类(AbstractNode
)。后者由多个具体类型的节点(ConcreteNodeA
,ConcreteNodeB
,ConcreteNodeC
)扩展。
我在我正在使用的代码中遇到了这个其他模式,其中具体类被实现为静态内部类,扩展了外部抽象类。同时,它们从外部(?)接口NodeA
实现静态内部接口(NodeB
,NodeC
,Node
)。
public interface Node {
public static interface NodeA {}
public static interface NodeB {}
public static interface NodeC {}
}
public abstract class AbstractNode implements Node {
public void foo() {
...
}
public void bar() {
...
}
...
public static class ConcreteNodeA extends AbstractNode implements Node.NodeA {
...
}
public static class ConcreteNodeB extends AbstractNode implements Node.NodeB {
...
}
public static class ConcreteNodeC extends AbstractNode implements Node.NodeC {
...
}
}
这种模式有什么用?通过多年的Java经验,我以前从未见过这样的东西。我的直觉说它是一种巨大的代码味道,因为具体的类经常被实例化并在整个代码中多次使用。无论如何,我并不担心效率,只是这是很难保持和延伸!将它们放在不同的类中会更有意义吗,对吗?
我已经搜索了更多正式的参考文献来证明这样做是不错的主意,但还没有找到任何东西。
没有编译错误,代码完美无缺。
答案 0 :(得分:13)
在描述类型的相关族(例如树的节点)时,此模式实际上非常常见。
一个原因很简单,它是一个方便的分组;这些类往往是单独的小,并且将它们全部集中在一个地方可以使它更容易阅读和维护,以及发送它们是紧密耦合的族并且打算一起使用的信号。
更令人信服的原因是它可以提供密封类的形式。通过在抽象类中使用私有构造函数,只有内部类可以访问它,这意味着内部类是仅允许的子类。