多态性与责任分工:如何避免“开启类型”

在设计具有层次关系的系统时,我经常遇到一个需要多态行为的问题,但是有多种类型的工作可以从这种多态实现中受益。

例如,考虑使用抽象语法树来组织解析的源以进行编译的编译器。 以多态方式组织逻辑很方便,因为您可能有多种类型的ValueProvider,每种类型都负责发出不同的代码以将值加载到操作堆栈上。 问题是您可能还希望对AST执行静态分析,在这种情况下,您希望对树执行完全不同的工作,但是可能具有取决于所分析节点类型的行为。 换句话说,您需要多态行为,但您不希望将分析代码与编译代码混合在一起。

我目前采用的方法是使用对象模型存储数据,该对象模型的职责是仅提供树。 然后,树的每个使用者(例如编译器或静态分析器)使用运行时类型信息来执行其逻辑的条件分支。 根据节点的类型,这不可避免地导致许多“if / else if”或“switch”编码。 只是这种丑陋的分支,多态性旨在解决,但并行,不相交的责任似乎需要它。

有没有更好的方法来构建它?

您似乎在寻找访客模式 :

访问者设计模式是一种将算法与其运行的对象结构分离的方法。 这种分离的实际结果是能够在不修改这些结构的情况下向现有对象结构添加新操作

(强调我的)