在设计具有层次关系的系统时,我经常遇到需要多态行为的问题,但有不止一种类型的工作可以从这种多态实现中受益。
例如,考虑一个使用抽象语法树来组织解析源以进行编译的编译器。以多态方式组织逻辑很方便,因为您可能有不止一种类型的 ValueProvider,每种类型负责发出不同的代码以将值加载到操作堆栈上。问题是您可能还想对 AST 执行静态分析,在这种情况下您想对树执行完全不同的工作,但仍然可能具有取决于所分析的节点类型的行为。换句话说,您想要多态行为,但不想将分析代码与编译代码混合在一起。
我目前处理此问题的方法是使用对象模型存储数据,该对象模型的职责只是提供树。然后,树的每个使用者(例如编译器或静态分析器)使用运行时类型信息来执行其逻辑的条件分支。这不可避免地会导致大量基于节点类型的“if/else if”或“switch”编码。多态性正是为了解决这种丑陋的分支,但并行、不相交的职责似乎需要它。
有更好的方法来构建它吗?
最佳答案
您似乎正在寻找 Visitor pattern :
the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures.
(强调我的)
关于c# - 多态与职责划分 : how to avoid 'switching on type' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586357/