我正在构建图表。图表由链接相互链接的节点组成(事实上我亲爱的)。 为了给每个节点分配给定的行为,我实现了策略模式。
class Node {
public BaseNodeBehavior Behavior {get; set;}
}
因此,在应用程序的许多部分中,我广泛使用类型反射来了解节点的行为。
if (node.Behavior is NodeDataOutputBehavior)
workOnOutputNode(node) ....
我的图表可以获得数千个节点。
我正在使用策略,因为我需要行为继承。例如,基本上,行为可以是Data或Operator,Data行为可以是IO,Const或Intermediate,最后IO行为可以是Input或Output。
因此,如果我使用枚举,我将无法测试节点行为是否为数据类型,我将需要将其测试为[Input,Output,Const或Intermediate]。如果以后我想添加另一种Data类型的行为,我搞砸了,每个数据测试方法都需要更改。
答案 0 :(得分:2)
if (node.Behavior is NodeDataOutputBehavior)
不反射并且非常快。
答案 1 :(得分:0)
将访客模式用于不同的节点行为将删除类型检查。但是,我会这样做以获得更清洁的设计,而不是性能,因为我怀疑会有任何显着的性能差异。
如果节点行为的类型在编译时是静态的,则访问者模式很有效。添加新节点行为时,可以向Visitor接口添加新方法,这意味着编译器会捕获未处理该行为的情况。
使用即席类型检查,您必须手动检查代码,以确定需要为新行为类型添加新处理程序的位置。